gpt4 book ai didi

c++ - 如何使用参数包和非类型模板值执行部分模板特化?

转载 作者:行者123 更新时间:2023-12-03 21:53:04 25 4
gpt4 key购买 nike

同时尝试 use a compile time std::array in a variadic template ,我写了这个部分模板特化:

template <typename array_wrapper> struct Test1;
template <std::size_t... A> struct Test1<any_type<std::array<std::size_t, sizeof...(A)>{A...}>> {}; //(2)

导致编译错误<Expression> has incomplete type and cannot be defined因为我尝试对 Test1 进行部分模板特化和 Test2当我尝试使用它时;因此——据我所知——用法 (3) 与定义 (2) 不匹配:

int main() {
Test1<any_type<std::array<std::size_t, 2>{1, 2}>> a; // (3)
}

虽然我不明白为什么会这样。在试验该示例时,我意识到当我在 any_type 中“隐藏”参数包的内容时会发生这种情况。结构:

#include <array>

template <auto f> struct any_type;

template <typename array_wrapper> struct Test1;
template <std::size_t... A> struct Test1<any_type<std::array<std::size_t, sizeof...(A)>{A...}>> {};

template <typename array_wrapper> struct Test2;
template <int... A> struct Test2<any_type<std::get<0>(A...)>> {};

template <typename array_wrapper> struct Test3;
template <int A> struct Test3<any_type<A>> {};

int main() {
//Test1<any_type<std::array<std::size_t, 2>{1, 2}>> a;
//Test2<any_type<1>> b;
Test3<any_type<1>> ok;
}

测试 1 和测试 2 失败并出现相同的错误,测试 3 工作正常。为什么部分模板特化在前两种情况下“失败”?据我了解,声明提供了“接口(interface)”以便使用结构,并且特化中的参数与实际提供的参数相匹配。

代码可以找到代码here .

编译选项:我用 g++-10.0 (GCC) 10.0.1 20200124 (experimental)并通过 g++ -std=c++2a file.cc 编译, c++2a 是必需的,因为我使用非类型模板参数。

最佳答案

模板参数可以从一组有限的模式中推导出来。对于模板非类型参数,该集合只是(来自 [temp.deduct.type]/8 ):

  • type[i]
  • template-name<i> (其中模板名称指的是类模板)
  • TT<i>

...就是这样。你的Test3匹配第 2 种形式,其他两种完全不匹配。

尚不清楚 Test2 是如何产生的例子会起作用。 Test1 example 可能是我们想要考虑的东西,因为在 C++20 之后非类型模板参数的使用激增,但它不是当前有效的东西。

关于c++ - 如何使用参数包和非类型模板值执行部分模板特化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60439202/

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