【发布时间】:2013-12-21 12:22:15
【问题描述】:
谁能给我这个问题的想法。我已经在互联网上搜索过这方面的信息,但无法获得我想要的太多信息。
说有一堂课。
class Foo {
explicit Foo() {}
int getVar1();
int getVar2();
void setVar1(int v);
void setVar2(int v);
private:
int var1, var2;
};
现在给出一个令牌列表 {"var1", "var2", ... "varN"},有什么方法可以在运行时创建函数名并调用 Foo 类型的某些对象的那些成员函数。喜欢例如
Foo obj;
string input = "Var1,Var2,Var3,...VarN";
vector<string> tokens = splitString(input);
for (vector<string>::const_iterator it = tokens.begin(); it != tokens.end(); ++it) {
string funName = "get" + *it;
// somehow call obj.getVar1()....obj.getVarN()
}
if else 适用于少量变量,但不适用于大量变量。使用 bind 和 functors 也不能解决这个问题。一个网页建议让内存在运行时可执行,然后使用 reinterpret_cast,我不知道这是否可行。
更新
好的,从互联网上的答案和其他搜索中,我看到在 C++ 中没有优雅的方法来做到这一点。到目前为止,C++ 中还没有反射。所有 hack 都需要成员函数指针的编译时解析。 当你有很多变量和 setter 和 getter 函数时,有人可以给我关于在这些场景中的替代类设计的想法......或者 getter 和 setter 在 c++ 中是否是好的实践?
【问题讨论】:
-
您不能在 C++ 中执行此操作,但是您可以通过次优方式获得等效功能。
-
你可以看看Boost.Reflect
-
我写了一个工具,可以帮助你根据你的类生成反射代码:github.com/hun-nemethpeter/cpp-reflector-mini
标签: c++ boost reflection function-pointers mprotect