我可以通过名称调用类的静态方法吗?

时间:2016-09-26 16:16:19

标签: c++ reflection static-methods

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

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

3 个答案:

答案 0 :(得分:0)

我认为这个问题非常广泛。我不确定你到底发生了什么,但这里有一些选择:

有一个像IParser这样的通用接口,所有子类都必须实现(在本例中是一个方法Parse)。你可以拥有一个采用IParser&。

的功能

如果您真的在通过姓名'比某种RPC更像我建议的另一种方法,你必须手动将函数注册到某种类型的映射中,该映射将指向函数的指针作为值,并将类的名称作为键。调用此函数就像map[fnName]();

一样简单

答案 1 :(得分:0)

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>{});
}

答案 2 :(得分:-1)

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

类::方法();