在 C++ 中展开模板类列表

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>(); 要安放各种类型的处理器,怎么可能呢?

Evg*_*Evg 6

在 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)