gpt4 book ai didi

c++ - 从模板参数的模板参数中提取值

转载 作者:行者123 更新时间:2023-11-30 01:34:03 24 4
gpt4 key购买 nike

在下面的代码中:

template<auto A>
struct S{};

template<template <auto A> class H>
auto foo(){
return A;
}

auto bar(){
return foo<S<1>>(); // should return 1
}

我希望它编译一个只返回 1 的 bar() 方法但是我得到这些错误:

<source>: In function 'auto foo()':
<source>:15:12: error: 'A' was not declared in this scope
15 | return A;
| ^
<source>: In function 'void bar()':
<source>:19:15: error: no matching function for call to 'foo<S<1> >()'
19 | foo<S<1>>();
| ^
<source>:14:6: note: candidate: 'template<template<auto A> class H> auto foo()'
14 | auto foo(){
| ^~~
<source>:14:6: note: template argument deduction/substitution failed:

有什么方法可以真正得到值A吗?

最佳答案

A不指定存在的东西。 foo 的参数是一个模板,而不是特化。区分是很重要的,因为这就是为什么传递 S<1> 时会出现不匹配错误的原因。 ,您所写内容的正确论点是 foo<S> .

S<1>是一个特化,它填充了缺失的位(参数)。但是 H不是特化,它是模板本身,没有参数。 A什么都没有,只是一些要填充的东西的助记符,它还不存在,所以你不能使用它。

要获得您想要的,需要部分模板特化。这不适用于函数模板,但我们可以通过转发到类模板的成员来绕过它。像这样:

template<auto A>
struct S{};

template<typename> struct foo_helper;

template<template <auto> class H, auto A>
struct foo_helper<H<A>> {
static auto run() { return A; }
};

template<class H>
auto foo(){
return foo_helper<H>::run();
}

auto bar(){
return foo<S<1>>(); // should return 1
}

现在foo的模板参数是一个类型(不是模板)。然后将该类型作为参数提供给助手,并与模板特化进行匹配。由于该类型填充了参数,因此特化将其提取并返回。

关于c++ - 从模板参数的模板参数中提取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56953553/

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