c++ - 如何使用折叠表达式来实例化可变参数模板函数中的每种类型?
问题描述
我正在尝试创建一个“对象管理器”,它将创建和存储模板类的实例。该类采用一个模板参数并从基类继承,以允许将具有不同模板参数的实例存储在同一容器中。将用作模板参数的类型将由用户在可变参数模板函数中提供。
以下是说明该问题的最小示例:
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>
with并将结果指针添加到向量 in ?new
Types
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>{} ), ... );
其中可变参数模板包使用逗号运算符折叠展开
推荐阅读
- python - 如何在 python 中使用 mechanize 发送带有 post 请求的原始 JSON 数据
- c++ - 激活上下文生成失败,依赖程序集,并排,事件 ID 33
- ruby-on-rails - jbuilder 视图呈现与布局
- c# - 在 .NET 中解析 URI
- laravel - 即使计数为 0,也返回年份计数
- gatsby - 如何使用 Gatsby + Netlify CMS 正确提供国际化
- reactjs - 执行 create-react-app 会出错
- angular - 使用 ngx-datepicker 更改 [(ngModel)] 上的日期格式
- c# - 使用 BouncyCastle 和 C# 将证书添加到 HTTPS 调用
- powershell - 无法将文件夹内容从一台服务器复制到服务器列表