我想在数组中存储一些闭包。 我标记了问题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;} ));
我希望能够为函数指针分配闭包,因为我不想定义几十个单独的函数。
提前感谢您的建议。
答案 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比函数指针更重,因为它包含闭合值(其中一些可能是隐藏的或非显而易见的)。