【问题标题】:c++ List of classes without initializing them for use of static functionsc ++类列表,无需初始化它们以使用静态函数
【发布时间】:2011-01-29 05:42:22
【问题描述】:

我可能会以一种奇怪的方式问这个问题,但我不知道还能怎么问。

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

【问题讨论】:

  • 你能详细说明一下吗?你打算用这些课程做什么?你想调用什么静态函数?这是在编译时还是在运行时?
  • 我想将一个类列表注册到一个工厂类的列表中。遍历这些类以查找我需要的类(使用静态方法),然后实例化并返回它。

标签: c++ list static


【解决方案1】:

此时我真的更喜欢函数指针:

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 函数(它只是需要访问更多范围)。

【讨论】:

  • 我选择了这条路线,所以我不必使用 boost,我可以练习实现函数指针。谢谢
【解决方案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

【讨论】:

  • 确实应该有更优雅的解决方案来解决这些问题。
  • @AlexanderRafferty: 0x 有可变参数模板。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    我不认为你的要求是可能的,至少不是你想的那样。您不能拥有变量、数组、容器类或任何其他类型名称的存储。所以你不能做类似的事情

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

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

    【讨论】:

      【解决方案5】:

      http://www.boost.org/doc/libs/1_45_0/libs/mpl/doc/refmanual/refmanual_toc.html

      例如:

      typedef vector<C1,C2,C3> types;
      at_c<types,0>::type::method();
      ...
      

      【讨论】:

      • 您的链接不是很有帮助。至少解释一下应该用它做什么。
      • 另外,我真的不推荐using mpl::vector;using namespace mpl;。与std::vector 混淆的可能性太大了。
      猜你喜欢
      • 1970-01-01
      • 2011-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多