Ken*_*cor 3 c++ templates c++11
我有一个模板函数可以用 T 类型做某事
template <class T>
void EmplaceProcessor()
{
T* pProcessor = new T();
m_vItemProcessors.emplace_back(pProcessor);
}
Run Code Online (Sandbox Code Playgroud)
如果我想实现很多类型来放置到向量中,就像:
template<class...A>
void EmplaceAllProcessor()
{
const int size = sizeof...(A);
for (int i = 0; i < size; ++i)
{
EmplaceProcessor<A[i]>(); //how to expand it?????
}
}
Run Code Online (Sandbox Code Playgroud)
我想调用 EmplaceAllProcessor<P1, P2, P3>(); 安装所有类型的处理器
我想调用 EmplaceAllProcessor<P1, P2, P3>(); 要安放各种类型的处理器,怎么可能呢?
在 C++11 中,您可以使用虚拟数组初始化技巧:
template<class... A>
void EmplaceAllProcessor() {
int dummy[] = {0, (EmplaceProcessor<A>(), 0)...};
(void)dummy;
}
Run Code Online (Sandbox Code Playgroud)
逗号运算符表达式用于按顺序调用EmplaceProcessor<A>()pack 中的每种类型(花括号列表中参数的计算顺序由它们在每个[dcl.init.list/4] 的A...列表中的顺序固定)。第一个需要支持空包并抑制未使用的变量警告。0(void)dummy;
如果我想返回一个值,比如:
bool EmplaceAllProcessor()返回是否成功,bool EmplaceAllProcessor()告诉是否所有的EmplaceProcessor工作都成功了,该怎么办呢?
如果不需要短路,这是上述方法的简单扩展:
template<class... A>
bool EmplaceAllProcessor() {
bool res[] = {true, EmplaceProcessor<A>()...};
return std::all_of(std::begin(res), std::end(res), [](bool b) { return b; });
}
Run Code Online (Sandbox Code Playgroud)
如果需要短路,可以使用另一个小技巧:
template<class... A>
bool EmplaceAllProcessor() {
bool res = true;
bool dummy[] = {true, (res = res && EmplaceProcessor<A>())...};
(void)dummy;
return res;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
139 次 |
| 最近记录: |