2013-01-05 39 views
8

这里是:我想创建一个void函数,它将接收两个众所周知的值类型和另一个可能是任何类型的值。该代码会是这样:C++发送任何类型的参数给一个函数

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; 
    } 
} 

我tryied使值的类型const void*但我得到一个错误(cast from ‘const void*’ to ‘short int’ loses precision),因为我只是做了这一点:short name = (short)value,必须是一些疯狂的绝望的审判,希望能得到幸运。现在,我不知道是否有办法做到这一点,传递任何类型的变量的指针,然后将其转换为它是什么(我知道根据每种情况期望的变量类型。 我该如何做到这一点?!谢谢

回答

7

因为你似乎事先知道所有潜在类型的value,并且要根据类型不同的行为,你可以只写了一系列函数重载:

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); 

这消除需要一个运行时间开关

+0

这是事实,但在这一点上,为什么不为每个设定不同的功能,避免了开关的情况下。 – Caesar

+0

是的 - 它使'设置'变量不必要。 –

+1

让我们试试这个。当然,我仍然可以使用开关和设置,如果我有不同的情况下,我需要一个int值,例如 – ali

5

假设你在谈论运行时间开关(与编译时相反,在这种情况下模板可能是答案):

你可以考虑一个变体类(例如,或者可能使用多态性(即,定义继承层次结构和虚拟功能来实现特定行为)。

+0

我想这是做这件事的专业方式,但是当我创建一些严肃的应用程序时,我会记住它。谢谢 – ali

+0

你的意思是'boost :: any'作为第二个选项?> – Puppy

12

您应该使用templates

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

太棒了!谢谢!那样做 – ali

+2

问题是当'T'是错误的类型时,他的运行时切换代码中的强制转换将无法编译。我只是写了一系列函数重载 –

+0

事实上,这就是发生了什么。 – ali

相关问题