如何使用fold表达式实例化可变模板函数中的每个类型



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

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

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都有一个默认构造函数。有没有一种方法可以使用fold表达式为Types中的每个类型创建一个具有newB<T>,并将结果指针添加到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>{} ), ... );

其中可变模板包使用逗号运算符折叠展开

最新更新