2011-01-29 35 views
4

我可能会以奇怪的方式问这个问题,但我不知道还有什么其他问题。C++不使用静态函数初始化它们的类列表

我想有一个类的列表,而不是对象。 这样我就可以调用静态函数而不必创建对象。

+0

你能再详细一点吗?你打算用这些课程做什么?你想要调用哪些静态函数?这是在编译时还是在运行时? – templatetypedef 2011-01-29 05:47:06

+0

我想将一个类的列表注册到工厂类的列表中。迭代这些类来寻找我需要的类(使用静态方法),然后实例化并返回它。 – Jeremiah 2011-01-29 13:29:33

回答

4

我真的喜欢函数指针在这一点上:

struct A 
{ 
    void SomeFunc(int); 
}; 

struct B 
{ 
    void AnotherFunc(int); 
}; 


typedef void (*Function)(int); 

std::vector<Function> vec; 

vec.push_back(A::SomeFunc); vec.push_back(B::AnotherFunc); 

for (Function f: vec) 
{ 
    f(2); 
} 

注意,静态函数是或多或少相当于到一个传统的C函数(它只需要访问更多的范围)。

1

作为一个解决方案,您可以创建方法指针列表

0

我不知道你在问的是可能的,至少不会在你认为的方式。您不能拥有变量,数组,容器类或任何其他类型名称的存储。所以你不能做像

ListOfClasses[n]::someStaticMember(...); 

在C++中。是不可能的。

2

您要找的是boost typelists。然而,如果您还不是非常经验模板,并且知道他们有多少错综复杂的工作,我不会建议潜入Boost MPL。

现在一个简单的自制实现:

struct Null {}; 

template <typename Type, typename Next> 
struct List 
{ 
    typedef Type Type; 
    typedef Next Next; 
}; 

//Now you can make lists like so: 
typedef List<int, List<float List<short, Null> > > MyList; 

从那里使用递归模板化的实现打电话给你想要的静态方法。

如果您想对这类技术的更多信息,请阅读Modern C++ Design