【问题标题】:Simple reflection mechanism简单的反射机制
【发布时间】:2014-05-05 17:48:08
【问题描述】:

是否有任何解决方案来运行名称由两个字符串连接创建的函数/宏?

我只是想做这样的事情:

template <char *A, char *B, int C> 
int function_that_run_other_function(void){

    // Here is the main point
    char function_name[80];
    strcpy (function_name, "function");
    strcat (function_name, A);
    strcat (function_name, B);
    return function_name(C);

}

我可以使用宏来做到这一点:

#define macro_that_run_function(A,B,C) \
    function_##A##B##(C);

但我不想使用宏,因为宏有很多问题。 是否可以在没有任何额外库的情况下在 C++ 中完成?

【问题讨论】:

  • 没有。使用宏。您对宏有什么特殊问题吗?
  • 在windows下你可以导出函数,然后使用getProcAddress获取函数指针来调用这个名字。大概在linux下也是可以的。
  • 你能发布预期的用例吗?由于您似乎已经静态地知道信息,所以应该有另一种方式。
  • 在我看来,调试宏不像 c++ 函数那么容易。这就是为什么我想在没有宏的情况下制作它。
  • @marcin_j '在 linux 下可能也是这样。' 当然是 ;) ...

标签: c++ reflection macros metaprogramming


【解决方案1】:

我很好奇,过了一会儿,我最终陷入了这个邪恶的混乱和一般的维护噩梦:

main.cpp:

#include <map>
#include <iostream>
#include <sstream>
#include <functional>
#include <cstring>

typedef std::function<void(int)> func;
typedef std::map<std::string, func> FuncMap;

template <char* A, char* B, int C>
void runner(FuncMap funcs){
    std::stringstream ss;
    ss <<A <<B;
    return funcs[ss.str()](C);
}

void ABC(int val) {
    std::cout <<"Woo: " <<val <<"\n";
}

extern char a[]; //due to external linkage requirement
extern char b[];

int main(...) {
    FuncMap funcs;
    strcpy(a, "A");
    strcpy(b, "B");
    funcs["AB"] = std::bind(&ABC, std::placeholders::_1);
    runner<a, b, 0>(funcs);
    return 0;
}

vars.cpp:

char a[5] = {""};
char b[5] = {""};

所以是的,只要有足够的力量,你就可以让 c++ 做一些你想做的事情,但我真的不推荐它。

【讨论】:

  • 我想知道与基于宏的解决方案相比,它的性能如何;)
  • 我会在深渊和不存在之间打赌;p
  • 好了,现在修改clang++前端,通过解析类定义自动输出这段代码。
  • @kec 如果您想要,请随意获取 clang 的源代码并执行此操作。这只是一个有趣的微型项目,我已经完成了。
【解决方案2】:

不,C++ 不允许编译或运行时操作或检查符号名称(除非实现指定类型信息的东西)。

动态库通常会导出名称(对于 C++ 已损坏,对于 `extern "C"`` 几乎未损坏),用于加载它们的库通常(总是?)允许按字符串值加载它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-14
    • 2011-04-16
    • 1970-01-01
    • 2021-08-20
    • 1970-01-01
    • 1970-01-01
    • 2010-09-22
    相关资源
    最近更新 更多