【问题标题】:Can I call a static method of a class by its name?我可以通过名称调用类的静态方法吗?
【发布时间】:2016-09-26 16:16:18
【问题描述】:

我有一堆具有相同静态方法名称的类,parse。我想为泛型类创建一个调用parse 的通用函数。

我可以使用类的字符串名称调用方法,还是可以将类作为函数参数传递?

【问题讨论】:

  • 你当然可以,使用模板元编程;但恐怕您正在考虑某种运行时反射,例如在 Java/C# 中,这在 C++ 中根本不可能。
  • 在 C++ 中不能真正传递一个类。您可以玩一些模板游戏,但最好还是去老学校并传递一个指向静态方法的指针。需要更多关于您想要达到的目标的信息才能确定。
  • 好吧,他所说的反射级别(按名称调用函数)显然在 C++ 中是可能的。无论如何,如果他不得不问这个问题,我不建议走那条路。为什么不为所有这些类提供一个通用接口,例如 IParser { virtual void parse() = 0;并让每个类实现 IParser。那么你的通用函数将是简单的 void Parse(IParser& p);或者你需要。如果您需要其他东西,则需要更具体地说明您希望这些东西如何工作。
  • 为什么投反对票?

标签: c++ reflection static-methods


【解决方案1】:

在我看来,这个问题非常广泛。我不确定你到底在追求什么,但这里有一些选择:

拥有一个所有子类都必须实现的通用接口,如 IParser(在本例中为 Parse 方法)。您可以拥有一个采用 IParser& 的函数。

如果您真的像某种 RPC 一样追求“按名称调用”,那么我建议您使用另一种方法,您必须手动将函数注册到某种映射中,该映射将指向函数的指针作为值和名称类作为关键。比调用这个函数更简单map[fnName]();

【讨论】:

    【解决方案2】:

    C++ 没有内置的反射机制。如果您对通过其字符串表示调用方法感兴趣,您需要自己处理name -> method pointer 映射。在这种情况下,std::unordered_mapstd::stringstd::function 可能会有所帮助。

    一个示例性的 c++11 代码:

    #include <iostream>
    #include <unordered_map>
    #include <string>
    #include <functional>
    
    struct Foo {
        static std::unordered_map<std::string, std::function<void(void)>> functions;
        static void bar() {
           std::cout << "Foo::bar called" << std::endl;
        }
    
        static void init() {
            functions["bar"] = &Foo::bar;
        }
    };
    
    std::unordered_map<std::string, std::function<void(void)> Foo::functions;
    
    int main() {
        Foo::init();
        Foo::functions["bar"]();
    }
    

    但是,如果您对通过字符串调用方法不感兴趣,而只想调用给定名称的特定方法,则可以使用模板:

    #include <iostream>
    
    struct foo {
        static void bar() {
           std::cout << "foo::bar called" << std::endl;
        }
    };
    
    template <class T>
    struct tag{};
    
    template <class T>
    void call_bar(tag<T>) {
        T::bar();
    }
    
    int main() {
        call_bar(tag<foo>{});
    }
    

    【讨论】:

      【解决方案3】:

      您只需要使用scope resolution operator:: 来使用公开它的类的名称来限定方法:

      类::方法();

      【讨论】:

      • 不是反对者,但他不仅仅是在问“你如何调用静态函数”
      猜你喜欢
      • 2014-08-03
      • 2015-06-22
      • 2011-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-27
      相关资源
      最近更新 更多