我有一堆具有相同静态方法名称的类parse
。我想创建一个通用函数,为泛型类调用parse
。
我可以使用类的字符串名称调用方法,还是可以将类作为函数参数传递?
答案 0 :(得分:0)
我认为这个问题非常广泛。我不确定你到底发生了什么,但这里有一些选择:
有一个像IParser这样的通用接口,所有子类都必须实现(在本例中是一个方法Parse)。你可以拥有一个采用IParser&。
的功能如果您真的在通过姓名'比某种RPC更像我建议的另一种方法,你必须手动将函数注册到某种类型的映射中,该映射将指向函数的指针作为值,并将类的名称作为键。调用此函数就像map[fnName]();
答案 1 :(得分:0)
C ++没有内置的反射机制。如果您对通过字符串表示形式调用方法感兴趣,则需要自己处理name -> method pointer
映射。在这种情况下,std::unordered_map
,std::string
和std::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 ::来使用暴露它的类的名称来限定方法:
类::方法();