【问题标题】:Compile time dynamic function call编译时动态函数调用
【发布时间】:2012-12-19 10:01:15
【问题描述】:

不确定标题是否突出了我的目标。

我可以在编译时动态调用方法吗? 例如:

int CallMethod(string methodName, string methodArg)
{
    Foo foo;
    return foo.#methodName(methodArg);
}

CallMethod("getValue", "test"); // This would attempt to call on a Foo instance, method getValue with argument "test" -- foo.getValue("test");

谢谢!

【问题讨论】:

  • 不,使用模板或宏。
  • 您的函数名称是像您在示例中发布的那样是编译时字符串文字,还是要从文件中读取/用户输入等?
  • @Karthik T : 字符串字面量
  • 在这种情况下,@YochaiTimmer's 将非常适合您。

标签: c++ macros sfinae compile-time


【解决方案1】:

你可以创建一个宏:

#define CallMethod(methodName, var) { Foo foo; foo.##methodName(var); }

在主函数中:

CallMethod(foo,"test");

【讨论】:

    【解决方案2】:

    这是Reflection 并且是not available natively in C++

    如果methodName 的可能值数量有限,您可以构建一个查找表,该表根据methodName 调用适当的函数,但您不能使用此系统调用任意函数。

    这可能是 @PaperBirdMaster 建议的 std::map 或一组巨大的 if-else 检查。但这不是真正的反射,只是相同的粗略错觉。

    【讨论】:

    • 我能想到的实现 OP 要求的唯一方法是使用字符串和成员函数指针创建映射......但这根本不是反射
    • 是否有可能在 boost 扩展的帮助下实现我想要做的事情?如果可能的话,你能给我一个使用 boost 的反射示例吗?谢谢!
    • 编译时不是反射。
    • @YochaiTimmer 是的,如果它是字符串文字,他可以尝试您的建议,它应该可以完美运行,不过我会将其附在 {} 中。但是,如果他想动态控制函数名称..
    猜你喜欢
    • 1970-01-01
    • 2021-10-12
    • 1970-01-01
    • 2022-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多