我有多个
升压:功能
键入已定义的成员:
typedef boost::function<void(PARAM_LIST1)> Func1;
typedef boost::function<void(PARAM_LIST2)> Func2;
typedef boost::function<void(PARAM_LIST3)> Func3;
...//and more
Func1 f1;
Func2 f2;
Func3 f3;
...//and more
我想将f1,f2,f3,...存储在一个容器中。 特别是,将所有f作为一个参数传递。
对于该模板,我应该使用什么类型的最佳匹配器? 谢谢!
答案 0 :(得分:1)
由于函数是不同的类型,并且没有允许使用基类(智能)指针的通用接口,因此它们不能存储在std::vector
或其他std
容器中。
一种可能的解决方案是使用boost::tuple
或用户定义的容器class
来存储不同的函数类型,然后可以将这些函数作为单个参数传递给函数。但是,这会将每个函数类型的实例数限制为一个(除非每个函数类型的容器用于存储函数实例)。见在线tuple demo。
答案 1 :(得分:1)
正如@hmjd所说,你可以使用boost::tuples
,但是如果你想对你存储的函数的数量和类型有更多的自由,你应该使用普通的容器(std::vector
,例如)与boost::any结合使用。
就像:
typedef boost::function<void(PARAM_LIST1)> Func1;
typedef boost::function<void(PARAM_LIST2)> Func2;
typedef boost::function<void(PARAM_LIST3)> Func3;
...
std::vector< boost::any > functions;
functions.push_back(Func1(actualFunc1));
functions.push_back(Func2(actualFunc2));
functions.push_back(Func3(actualFunc3));
...
并且它用于为每个函数转换精确类型:
Func1 & f1 = boost::any_cast< Func1 >(functions[0]);
f1(...) //actual usage
Func2 & f2 = boost::any_cast< Func2 >(functions[1]);
f1(...) //actual usage
甚至直接:
boost::any_cast< Func3 >(functions[2])(...) //actual usage