gpt4 book ai didi

c++ - 函数签名中未扩展的参数包

转载 作者:行者123 更新时间:2023-12-01 14:07:34 27 4
gpt4 key购买 nike

较新的 GCC 引入了新的内置 __integer_pack帮助它实现std::make_integer_sequence和 friend 。由于原因(tm),我无法使用此功能,因此我正在尝试重新实现它(然后使用#define 替换标准库的用法)
它以 __integer_pack(N)... 的形式使用,这扩展了它的“返回值”。但是我无法说服我自己的模板类型与此匹配,clang (10) 错误:

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执行扩展。
您将需要使用该语言编写自己的实现(或复制现有的实现)。

关于c++ - 函数签名中未扩展的参数包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63013137/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com