首页 > 解决方案 > 如何在初始化列表中在编译时包含不同数量的对象?

问题描述

我需要包含不同数量的对象,具体取决于提供的“定义”和不同的 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'。

有没有办法做得更好?可能在此类声明或其他任何内容中推出宏。

标签: c++templatesmacrosinitializationcompile-time

解决方案


使用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

在线观看演示

请注意,上述解决方案需要编译器支持。


推荐阅读