2013-01-05 10 views
8

Oto ona: chcę utworzyć funkcję pustki, która otrzyma dwa dobrze znane typy wartości i kolejną, która może być dowolna. Kod byłoby tak:C++ wysyła argumenty dowolnego typu do funkcji

void change_settings(string element, short setting, ??? value) { 
    switch (setting) { 
     case ST_NAME: 
      // Cast value to string or char* and change element.name 
     break; 
     case ST_AMOUNT: 
      // Cast value to integer and change element.amount 
     break; 
     case ST_ENABLED: 
      // Cast value to boolean and change element.enabled 
     break; 
    } 
} 

I tryied aby wartość za typ const void* ale pojawia się błąd (cast from ‘const void*’ to ‘short int’ loses precision), bo po prostu to zrobił: short name = (short)value, która musi być trochę szalony desperacką próbę, chcąc mieć szczęście . Teraz nie wiem, czy istnieje sposób, aby to zrobić, przekazać wskaźnik jakiejkolwiek zmiennej, a następnie przekonwertować ją na to, co to jest (znam typ zmiennej, której można oczekiwać w zależności od każdego przypadku.) Jak to zrobić ? Dzięki

Odpowiedz

7

Ponieważ wydaje się wiedzieć z wyprzedzeniem wszystkie potencjalne rodzaje value i chcesz różne zachowanie w zależności od rodzaju, można po prostu napisać serię przeciążeniem funkcja:

void change_settings(const std::string& element, short setting, const std::string& value); 

void change_settings(const std::string& element, short setting, int value); 

void change_settings(const std::string& element, short setting, bool value); 

eliminuje potrzeba przełącznika wykonawczego.

+0

to prawda, ale w tym punkcie Dlaczego nie stworzyć inną funkcję dla każdego ustawienia i uniknąć sprawy przełącznika. – Caesar

+0

Tak - powoduje, że zmienna 'setting' jest niepotrzebna. –

+1

Spróbujmy tego. Oczywiście nadal mogę używać przełącznika i ustawienia, jeśli mam różne przypadki, w których potrzebuję wartości int, na przykład – ali

5

Zakładając, że mówisz o przełączaniu w czasie działania hing (w przeciwieństwie do kompilacji, w którym to przypadku prawdopodobnie są to szablony):

Można rozważyć wariant klasy (np. boost::variant), lub może użyć polimorfizmu (tj. Zdefiniować hierarchię dziedziczenia i funkcje wirtualne do implementacji określonych zachowań).

+0

Przypuszczam, że jest to profesjonalny sposób robienia tego, ale będę o tym pamiętać, kiedy stworzę jakiś poważny wniosek. Dzięki – ali

+0

masz na myśli 'boost :: any' jako drugą opcję?> – Puppy

12

Należy użyć templates

template <typename T> 
void change_settings(string element, short setting, T value); 
+0

Świetnie! Dzięki! To by to zrobiło – ali

+2

Problem polega na tym, że obsada w jego kodzie przełączania czasu pracy nie skompiluje się, gdy 'T' jest niewłaściwym typem. Napisałem serię przeciążeń funkcji. –

+0

Rzeczywiście tak się dzieje. – ali