【问题标题】:Function name generation and calling in C++C++中的函数名生成和调用
【发布时间】:2015-02-24 06:53:15
【问题描述】:

我有 10 个具有通用名称的函数,它们返回如下引用:

int& function0();
int& function1();
...int& functionN();

如您所见,函数名称中只有一个字母发生了变化。每个功能做不同的工作。我的用例有一定的长度,比如 L,我必须调用从 0 到 L 的函数。所以我想以某种方式生成这些函数名称并调用它们,而不是基于 L 对所有函数调用进行硬编码。所以如果在循环中索引 i 是从 0 到 L,对于我想调用 functioni() 的每个 i。

我尝试的一种方法是将这些函数存储到函数指针数组中,但这不起作用,因为这些函数返回引用并且引用数组是不可能的。我还尝试使用宏连接来生成函数名称,但这也是不可能的,因为宏不能在预处理时替换某些变量的值(MACRO(function,i) 不能替换 i 的值,连接到 functioni)。

我如何在 C++ 中做这样的事情?

【问题讨论】:

  • 为什么不把所有这些函数都变成一个函数,将i作为参数传递,并使用if语句检查i的值,并根据它返回正确的参考。
  • 我无法更改函数的代码。
  • 然后创建一个新函数,根据i的值调用这些函数。
  • 然后你必须在那个函数中硬编码,你必须检查我传递给函数的内容,然后调用那个函数。请不要提供解决方案。我想知道这样的事情在 C++ 中是否可行,如果可以,怎么办?
  • 顺序重要吗?如果你能把它们从 L 调用到 0,你就可以写一个邪恶的 switch 语句。

标签: c++ function macros


【解决方案1】:

这在 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

【讨论】:

  • 感谢天顶!这似乎可以解决问题。我也尝试使用函数指针数组,但没有使用 typedef。我直接为返回引用的函数创建了一个函数指针数组。这失败了,因为引用数组是不可能的。 PS。您可能想在最后一行中说 functions[0]。
【解决方案2】:

您可以将函数指针数组存储为answered by Zenith

C++11 中,您可以有一个函数数组closures,例如使用std::functionlambda 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 文件名)然后dlsym,通过其名称检索函数指针。然后您将声明extern "C" int& function0();(以避免name mangling - 否则您需要将损坏的名称传递给dlsym)并且您需要将程序与-rdynamic -ldl 链接;见C++ dlopen mini howto

【讨论】:

    猜你喜欢
    • 2023-03-11
    • 1970-01-01
    • 2012-07-29
    • 1970-01-01
    • 1970-01-01
    • 2012-02-11
    • 2013-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多