如何使用折叠表达式实例化可变参数模板函数中的每种类型?

How to use fold expression to instantiate each type in a variadic template function?

我正在尝试创建一个“对象管理器”,它将创建和存储模板实例 class。 class 采用一个模板参数并继承自基础 class 以允许具有不同模板参数的实例存储在同一容器中。将用作模板参数的类型将由用户在可变参数模板函数中提供。

下面是一个说明问题的最小示例:

struct A
{
    int m_a = 0;
};

template<typename T>
struct B : public A
{
    int m_b = 1;
    T m_t;
};

template<typename... Types> std::vector<A*> generate_a_vec()
{
    std::vector<A*> a_vec; // <--- Need to initialize with a new B<T> for each T in "Types"
    return a_vec;
}

int main()
{
    std::vector<A*> a_vec = generate_a_vec<int, float, bool>();

    for(A* a : a_vec)
    {
       std::cout << a->m_a << std::endl;
    }

    return 0;
}

让我们假设我们将使用的每个 T 都有一个默认构造函数。有没有一种方法可以使用折叠表达式为 Types 中的每种类型创建 B<T>new,并将结果指针添加到 generate_a_vec() 中的向量?

如果我没看错你想要什么,你正在寻找

std::vector<A*> a_vec { new B<Types>{}... };

但这不是“折叠表达”;这是一个简单的可变参数模板包扩展,从 C++11 开始可用。

“折叠表达式”(可从 C++17 获得)的示例如下

std::vector<A*> a_vec;

( a_vec.push_back( new B<Types>{} ), ... );

使用逗号运算符折叠扩展可变参数模板包