简单的反射机制

时间:2014-05-05 17:48:08

标签: c++ reflection macros metaprogramming

是否有任何解决方案来运行一个函数/宏,该名称是通过串联两个字符串创建的?

我只是想做那样的事情:

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 ++?

2 个答案:

答案 0 :(得分:1)

我很好奇,过了一会儿,我最终得到了这个不敬虔的混乱和一般的mamostace噩梦:

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 ++按照你想要的方式做点什么,但我真的不推荐它。

答案 1 :(得分:0)

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

动态库通常会导出名称(对于C ++来说很糟糕,对于`extern&#34; C&#34;``来说几乎没有),并且通常(总是?)加载它们的库允许它们通过字符串值加载。 / p>