c++ - 如何在初始化列表中在编译时包含不同数量的对象?
问题描述
我需要包含不同数量的对象,具体取决于提供的“定义”和不同的 ctor 参数
inline static std::array<A::Output, NUM_OUTPUTS> s_Outputs =
{
#if NUM_OUTPUTS > 0
A::Output{0}
#endif
#if NUM_OUTPUTS > 1
, A::Output{1}
#endif
#if NUM_OUTPUTS > 2
, A::Output{2}
#endif
};
那么NUM_OUTPUTS
应该创建对象的相应数量。每个对象都有一个索引,第一个是' 0
',每个下一个都是' +1
'。
有没有办法做得更好?可能在此类声明或其他任何内容中推出宏。
解决方案
使用std::make_index_sequence
和你可以做的变量模板。
#include <utility> // std::integer_sequence
template <std::size_t... I>
constexpr auto makeArray(std::index_sequence<I...>)
{
return std::array<A::Output, sizeof...(I)>{I...};
}
template<std::size_t NUM_OUTPUTS>
constexpr static std::array<A::Output, NUM_OUTPUTS> s_Outputs = makeArray(std::make_index_sequence<NUM_OUTPUTS>{});
现在你可以
constexpr auto arr1 = s_Outputs<1>; // 0
constexpr auto arr2 = s_Outputs<2>; // 0 1
constexpr auto arr3 = s_Outputs<3>; // 0 1 2
(在线观看演示)
请注意,上述解决方案需要c++14编译器支持。
推荐阅读
- java - 如何使用复选框从 ListView 设置变量值?
- javascript - 尝试获取标头值时出现键错误
- typescript - 我如何在 WebStorm 中“运行”一个 TypeScript 文件?
- python - 未键入的全局名称“pvc_sim”:无法确定 Numba 类型
- mongodb - 如何删除具有不同值的重复文档
- python - 如何在 python 中使用 wget.download() 下载文件并使用用户名和密码进行身份验证
- ios - 从以编程方式创建 pageviewcontroller 的地方获取 viewcontroller 的引用
- mysql - 无法在 MySQL 中使用 ALTER TABLE 添加外键
- reactjs - 如何根据字段的值更改路由
- javascript - React/AntDesign 如何使行可拖动?(表格拖动排序)