std::initializer_list
是一个有用的工具,可以在 C++ 中初始化许多容器,当我尝试使用 C++ 模板生成算术级数时,我发现它存在一些问题。
下面是成功的实现。
template <typename _Tp, _Tp first_elem, int item_number, typename = void, _Tp... args>
struct arithmetic_sequence {
static constexpr std::initializer_list<_Tp> value = {args...};
};
template <typename _Tp, _Tp first_elem, int item_number, _Tp... args>
struct arithmetic_sequence<_Tp, first_elem, item_number, std::enable_if_t<sizeof... (args) < item_number>, args...> {
static constexpr std::initializer_list<_Tp> value = arithmetic_sequence<_Tp, first_elem, item_number, void, args..., first_elem + sizeof... (args)>::value;
};
但是我发现如果我用普通常数替换
first_elem + sizeof... (args)
,生成将会失败。
我想知道为什么
sizeof... (args)
这么特别,可以让编译器做我想要的事情。
基本方法论 在 C++ 中,sizeof 是一个返回对象或数据类型的大小(以字节为单位)的运算符。 当应用于参数包 (args...) 时,sizeof...(args) 计算包中所有元素的总大小,假设它们具有相同的数据类型。 但是,sizeof 不能直接应用于参数包。
对于模板:-
std::enable_if_t