当我尝试在C++编译时创建initializer_list时有些麻烦

问题描述 投票:0回答:1

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++ templates constexpr initializer-list
1个回答
0
投票

基本方法论 在 C++ 中,sizeof 是一个返回对象或数据类型的大小(以字节为单位)的运算符。 当应用于参数包 (args...) 时,sizeof...(args) 计算包中所有元素的总大小,假设它们具有相同的数据类型。 但是,sizeof 不能直接应用于参数包。

对于模板:- std::enable_if_t 的第一个专门化检查 args 包中的当前元素数量(使用 sizeof...(args))是否小于所需的项目数量 (item_number)。 如果是这样,那就是基本情况。它使用 args 中的元素构造一个initializer_list(第一次调用时可能为空)。

© www.soinside.com 2019 - 2024. All rights reserved.