9

就是这样:我想创建一个 void 函数,它将接收两个众所周知的值类型,另一个可以是任何值。代码将是这样的:

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

我尝试创建值的类型const void*,但我得到一个错误(cast from ‘const void*’ to ‘short int’ loses precision),因为我只是这样做了:short name = (short)value,这一定是一些疯狂的绝望试验,希望能走运。现在,我不知道是否有这样做的方法,传递任何类型的变量的指针,然后将其转换为它是什么(我知道根据每种情况预期的变量类型。我该怎么做?谢谢!

4

3 回答 3

13

你应该使用模板

template <typename T>
void change_settings(string element, short setting, T value);
于 2013-01-05T20:12:15.587 回答
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);

这消除了对运行时切换的需要。

于 2013-01-05T20:11:20.313 回答
5

假设您正在谈论运行时切换(与编译时相反,在这种情况下模板可能是答案):

您可以考虑一个变体类(例如boost::variant),或者可能使用多态性(即定义继承层次结构和实现特定行为的虚函数)。

于 2013-01-05T20:12:06.880 回答