gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 09:47:39 24 4
gpt4 key购买 nike

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

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

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我们将使用一个默认的构造函数。有没有办法使用折叠表达式来创建 B<T>new对于 Types 中的每种类型并将生成的指针添加到 generate_a_vec() 中的 vector ?

最佳答案

如果我正确理解你想要什么,那么你正在寻找

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

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

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

std::vector<A*> a_vec;

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

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

关于c++ - 如何使用折叠表达式实例化可变参数模板函数中的每种类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64235510/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com