2016-09-26 93 views
-1

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

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

+0

你当然可以使用模板元编程;但恐怕你正在考虑像Java/C#中的某种运行时反射,这在C++中根本无法实现。 –

+0

无法真正通过C++中的类。有一些你可以玩的模板游戏,但是你最好走老派并传递一个指向静态方法的指针。需要更多关于你想要知道的信息。 – user4581301

+0

那么他所说的反射级别(按名称调用函数)在C++中显然是可能的。无论如何,如果他不得不问这个问题,我不会推荐走这条路。为什么不只是像IParser {virtual void parse()= 0; }并让每个类实现IParser。那么你的泛型函数将会是简单的无效解析(IParser & p);或者你需要的。 如果你还需要别的东西,你需要更具体地说明你想要这样的东西是如何工作的 –

回答

-1

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

类::方法();

+0

不是downvoter,但他不是简单地问'你怎么称呼静态功能' – George

0

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

有一个像所有子类必须实现的常见接口,如IParser(在这种情况下,一个方法解析)。你可以有一个功能需要IParser &。

如果你真的像'某个名称的呼叫'之类的某种形式的RPC比我会建议另一种方法,你必须手动注册函数到某种需要一个指针函数作为值的映射,和类的名称作为关键。比调用这个函数更容易map[fnName]();

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>{}); 
} 
相关问题