我有10个具有通用名称的函数,它们返回如下引用:
int& function0();
int& function1();
...int& functionN();
正如您所看到的,功能名称中只有一个字母发生变化。每个功能都有不同的工作。我的用例给出了一些长度,比如L,我必须调用从0到L的函数。所以我想以某种方式生成这些函数名称并调用它们而不是硬编码基于L的所有函数调用。所以如果在循环中索引i从0到L,对于每个我想调用functioni()。
我尝试过的一种方法是将这些函数存储到函数指针数组中,但这不起作用,因为这些函数返回引用,并且引用数组是不可能的。我也尝试使用宏连接来生成函数名,但这也是不可能的,因为宏不能在预处理时替换某些变量的值(MACRO(函数,i)不替换i的值,连接到functioni)。
我怎样才能在C ++中做这样的事情?
答案 0 :(得分:5)
在C ++中这是不可能的,但在你的情况下,一个函数指针数组似乎是一个很好的解决方案:
typedef int& (* functionPtr)();
functionPtr functions[N];
// or without typedef: int& (* functions[N])();
functions[0] = foo; // assign a function named foo to index 0
int& i = functions[0](); // call function at index 0
答案 1 :(得分:1)
您可以存储一组函数指针,如answered by Zenith。
在C++11中,您可以拥有一个函数数组closures,例如使用std::function和lambda expressions。您可以将一些std::map<std:string,std::function<int&(void)>>
个关联名称与闭包相关联。
您可以将调用包含在某些函数中,例如
int& dofunction(int n) {
switch 0: return function0();
switch 1: return function1();
/// etc...
};
您可以编写一些小脚本(例如在awk,python,shell等中)来生成上述dofunction
的C ++代码。
最后,在某些操作系统(例如Linux和大多数POSIX)上,您可以使用dlopen(3)(带有NULL
文件名)然后{{1}在运行时通过其名称检索函数指针}。然后,您将声明dlsym
(以避免name mangling - 另外您需要将错位的名称传递给extern "C" int& function0();
),并且您需要将程序与dlsym
相关联;见C++ dlopen mini howto。