将闭包存储在一个数组中

时间:2015-01-22 11:59:42

标签: visual-studio-2010 c++11

我想在数组中存储一些闭包。 我标记了问题MSVC10,因为根据c ++ 11,闭包似乎应该与函数指针兼容(至少在某些条件下),但MSVC10不支持。

有没有解决这个限制的方法?

示例:

  typedef double (*Func)(const C* c);

  struct Feature{
    Feature(FeatureId i_id = None, const QString& i_name=QString(), Func i_ex = nullptr)
      :id(i_id),name(i_name), extraction(i_ex)
    {}
    FeatureId id;
    QString   name;
    Func      extraction;
  };

  QList<Feature> features;

  features.append(Feature(feat_t, "a/t", [](const C* c) -> double{return c->a.t;} ));

我希望能够为函数指针分配闭包,因为我不想定义几十个单独的函数。

提前感谢您的建议。

1 个答案:

答案 0 :(得分:1)

您应该使用std::function<double(const C*)>(请参阅this)而不是Func,所以

 struct Feature{
    FeatureId id;
    QString name;
    std::function<double(const C*)> extraction;
   /// etc...
 };

您可能需要升级编译器(我猜Visual Studio 2010在<{em> C++11标准之前出现,但我从未使用过Windows或其他Microsoft产品)。您是否考虑使用最近的GCC(至少4.9)或最近的Clang/LLVM(3.5)?

如果无法升级编译器,请坚持使用C ++ 98并且不要使用C ++ 11功能。

根据定义,closure比函数指针更重,因为它包含闭合值(其中一些可能是隐藏的或非显而易见的)。