我们能否从运行时给出的参数中检测出要动态调用的函数
Can we detect what function to call on fly from parameters given at runtime?
假设我们有N
函数覆盖,我们收到argunments数组,将其解析为某些类型(例如第一次我们得到int
,string
,string
;第二次我们得到int
,int
,int
);现在我们想调用第一组参数我们的call(int, string, string)
而第二次call(int, int, int)
。我们可以检测使用参数类型数组动态调用哪个函数吗?
不能在运行时在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;
}
您可以简单地使用相关参数编写重载成员函数吗?
如果您收到未知数量的参数,并希望基于它们调用正确的函数,那么您将需要一些额外的工作。 也许有一个枚举作为第一个参数,这意味着一个参数集,例如:
enum eParamList
{
eParamList_START,
IntIntInt, // following data is 3 ints
IntIntChar, // following data is int, int, bool (only joking its a char)
eParamList_ENDS
}
还是类似的东西?
这是低技术含量的方法。我不知道你所说的参数类型数组到底是什么意思,但让我们假设你得到了某种叫做 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;
}
相关文章:
- std::向量与传递值的动态数组
- 在c++中用vector填充一个简单的动态数组
- 检测到堆损坏:在正常块 c++ 动态 2D 数组之后
- ASAN 检测与动态加载库共享的类的 vtable 的 ODR 违规
- 在 c++ 中动态检测文件的字符集
- 使用新运算符C 检测动态分配
- 检测动态链接到 FFMPEG C++代码时出现警告VSP2005和错误VSP1048
- 如何检测对象是否主要由堆栈或动态内存组成
- 检测到堆损坏(动态阵列重新调整大小)
- 如何从被调用方的角度检测内存是动态的还是静态的
- ***glibc检测到***和动态分配问题-C++
- 动态检测并执行类实例的某些方法
- C++静态和动态内存泄漏检测工具是如何工作的
- 检测动态分配的对象
- 如何使用动态强制转换检测指针的删除
- 堆损坏检测(模拟动态数组与静态数组)
- 在动态数组c++中检测到堆损坏
- 使用 OpenCV 进行动态背景分离和可靠的圆圈检测
- /a.检测到Glibc.out: munmap_chunk():无效指针- c++结构体的动态数组
- 检测到 glibc,但我没有使用动态内存?