函数签名中未扩展的参数包
Unexpanded parameter pack in function signature
较新的 GCC 引入了一个新的内置 __integer_pack
来帮助它实现 std::make_integer_sequence
和朋友。由于Reasons(tm),我无法使用这个函数,所以我尝试重新实现它(然后使用#define 来代替标准库的用法)
它以__integer_pack(N)...
的形式使用,扩展了它的“return值”。但是我无法说服我自己的模板类型与此匹配,clang (10) erroring with:
error: pack expansion does not contain any unexpanded parameter packs
using make_integer_sequence = integer_sequence<_Tp, integer_pack(_Num)...>;
这可能吗?
这是我目前得到的:
#include <cstddef>
template <std::size_t...> struct index_sequence {};
template <std::size_t N, std::size_t... Is>
struct integer_pack : integer_pack<N - 1, N - 1, Is...> {};
template <std::size_t... Is>
struct integer_pack<0u, Is...> : index_sequence<Is...> { using type = index_sequence<Is...>; };
// Assume nothing below here can be changed.
#include <iostream>
/// Class template integer_sequence
template<typename _Tp, _Tp... _Idx>
struct integer_sequence
{
typedef _Tp value_type;
static constexpr size_t size() noexcept { return sizeof...(_Idx); }
};
// debugging aid
template<typename T, T... ints>
void print_sequence(integer_sequence<T, ints...> int_seq)
{
std::cout << "The sequence of size " << int_seq.size() << ": ";
((std::cout << ints << ' '),...);
std::cout << '\n';
}
template<typename _Tp, _Tp _Num>
using make_integer_sequence = integer_sequence<_Tp, integer_pack(_Num)...>;
int main()
{
print_sequence(make_integer_sequence<int, 20>{});
}
不,这是不可能的。 __integer_pack
不是一个函数,它是一个占位符,被编译器扩展成一个参数包。这不是您可以在语言中复制的东西。
您可以查看 gcc 如何实现将对 __integer_pack
的调用替换为 gcc/cp/pt.c,目前 starting at line 3750 中的扩展。 builtin_pack_fn_p()
标识对 __integer_pack
的调用(_p
后缀表示“谓词”),expand_integer_pack
执行扩展。
您需要使用该语言编写自己的实现(或复制现有的实现)。
较新的 GCC 引入了一个新的内置 __integer_pack
来帮助它实现 std::make_integer_sequence
和朋友。由于Reasons(tm),我无法使用这个函数,所以我尝试重新实现它(然后使用#define 来代替标准库的用法)
它以__integer_pack(N)...
的形式使用,扩展了它的“return值”。但是我无法说服我自己的模板类型与此匹配,clang (10) erroring with:
error: pack expansion does not contain any unexpanded parameter packs
using make_integer_sequence = integer_sequence<_Tp, integer_pack(_Num)...>;
这可能吗?
这是我目前得到的:
#include <cstddef>
template <std::size_t...> struct index_sequence {};
template <std::size_t N, std::size_t... Is>
struct integer_pack : integer_pack<N - 1, N - 1, Is...> {};
template <std::size_t... Is>
struct integer_pack<0u, Is...> : index_sequence<Is...> { using type = index_sequence<Is...>; };
// Assume nothing below here can be changed.
#include <iostream>
/// Class template integer_sequence
template<typename _Tp, _Tp... _Idx>
struct integer_sequence
{
typedef _Tp value_type;
static constexpr size_t size() noexcept { return sizeof...(_Idx); }
};
// debugging aid
template<typename T, T... ints>
void print_sequence(integer_sequence<T, ints...> int_seq)
{
std::cout << "The sequence of size " << int_seq.size() << ": ";
((std::cout << ints << ' '),...);
std::cout << '\n';
}
template<typename _Tp, _Tp _Num>
using make_integer_sequence = integer_sequence<_Tp, integer_pack(_Num)...>;
int main()
{
print_sequence(make_integer_sequence<int, 20>{});
}
不,这是不可能的。 __integer_pack
不是一个函数,它是一个占位符,被编译器扩展成一个参数包。这不是您可以在语言中复制的东西。
您可以查看 gcc 如何实现将对 __integer_pack
的调用替换为 gcc/cp/pt.c,目前 starting at line 3750 中的扩展。 builtin_pack_fn_p()
标识对 __integer_pack
的调用(_p
后缀表示“谓词”),expand_integer_pack
执行扩展。
您需要使用该语言编写自己的实现(或复制现有的实现)。