1

我有很多

提升:功能

类型定义的成员:

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 作为一个参数传递。

什么是最好的容器,我应该为模板使用什么类型?谢谢!

4

2 回答 2

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 
于 2013-07-15T11:32:49.057 回答
1

由于函数是不同的类型,并且没有允许使用基类(智能)指针的通用接口,因此它们不能存储在容器std::vector或其他std容器中。

一种可能的解决方案是使用boost::tuple或用户定义的容器class来存储不同的函数类型,然后可以将其作为单个参数传递给函数。但是,这将每个函数类型的实例数限制为一个(除非每个函数类型都使用一个容器来存储函数实例)。请参阅在线元组演示

于 2013-07-15T10:09:56.267 回答