假设我们有N
函数覆盖,我们接收参数数组,将其解析为某些类型(比如第一次得到int
, string
, string
;第二次得到int
, int
, int
);现在我们要call(int, string, string)
第二次调用我们的第一组参数call(int, int, int)
。我们可以检测到具有参数类型数组的动态调用哪个函数吗?
问问题
122 次
3 回答
1
这是低技术的做法。我不知道参数类型数组的确切含义,但我们假设给您某种称为 的向量args
,您可以确定一个元素是否为数字,并将该元素转换为数字或字符串。然后,您可以实现这样的循环:
std::string s[3];
int n[3];
unsigned mask = 0;
for (int i = 0; i < args.size(); ++i) {
if (is_number(args[i])) {
mask |= (1U << i);
n[i] = get_number(args[i]);
} else {
s[i] = get_string(args[i]);
}
}
然后,打开面具:
switch (mask) {
case 0x01: call(n[0], s[1], s[2]); break;
case 0x07: call(n[0], n[1], n[2]); break;
default:
std::cout << "unhandled combination: " << mask << std::endl;
break;
}
于 2012-06-15T15:12:33.087 回答
1
您不能在运行时在C++中进行类型选择。那是因为C++是强类型语言之一。
你可以做一些类似于你在 Python 中建议的事情——变量很乐意在运行时改变它们的类型。
您可以使用继承类和派生类做一些接近但不完全相同的事情。如果你有一个超类,你可以有一个“工厂”函数,它返回一个指向超类的指针(包含一个 diff 对象,具体取决于某些输入)。现在,如果所有对象都实现了所需的功能,您可以在指针上调用一个函数。例如:
class Base{
virtual void functionality();
};
class Squirrel : public Base{
void functionality() {
std::cout << "I love hazelnuts!" << std::endl;
}
};
class Box : public Base{
void functionality() {
std::cout << "Stuff can be put in here!" << std::endl;
}
};
Base *factoryMethod(std::string someInput){
if (someInput == "1")
return new Squirrel();
else
return new Box();
}
int main(void){
std::cin >> input;
Base *object = factoryMethod(input);
object->functionality();
return 0;
}
于 2012-06-15T10:34:35.843 回答
1
您可以简单地使用相关参数编写重载成员函数吗?
如果您收到未知数量的参数并希望根据它们调用正确的函数,那么您将需要做一些额外的工作。也许有一个枚举作为第一个参数,这意味着一个参数集,例如:
enum eParamList
{
eParamList_START,
IntIntInt, // following data is 3 ints
IntIntChar, // following data is int, int, bool (only joking its a char)
eParamList_ENDS
}
还是这样的?
于 2012-06-15T11:52:02.063 回答