gpt4 book ai didi

c++ - SFINAE+类型特征的自动类型推导失败

转载 作者:行者123 更新时间:2023-11-30 05:07:24 25 4
gpt4 key购买 nike

这个最小的可编译示例似乎是 SFINAE 的一个非常标准的设置:

#include <type_traits>

struct AType{};

// Helper type-trait templates for AType
template<typename T> struct isAType{ static const bool value = false; };
template<> struct isAType<AType>{ static const bool value = true; };

template<typename T>
void function( typename std::enable_if<isAType<T>::value, T>::type& t
) {}

int main()
{
AType a1;

// This line, using automatic type deduction, fails to compile:
// function( a1 );

// If you manually specify template parameter, it compiles:
function<AType>( a1 );
}

function( a1 ); 未注释时,我收到的错误消息如下:

main.cpp: In function ‘int main()’:
main.cpp:17:16: error: no matching function for call to ‘function(AType&)’
function( a1 );
^
main.cpp:10:6: note: candidate: template<class T> void function(typename
std::enable_if<isAType<T>::value, T>::type&)
void function( typename std::enable_if<isAType<T>::value, T>::type& t )
{}
^
main.cpp:10:6: note: template argument deduction/substitution failed:
main.cpp:17:16: note: couldn't deduce template parameter ‘T’
function( a1 );

我看过 some posts表示“T”处于非推导上下文中。 “非演绎上下文”对我来说是一个新概念,但在其他地方已经洒了足够多的墨水,我可以弄明白。我想我的问题是,是否可以调整我的 function 声明,使自动类型推导能够成功。是否有一种规范的方法来实现具有类型特征的 SFINAE,以便自动类型推导成功?

最佳答案

并非所有 C++ 编译器都支持它,但如果您的编译器支持,那么这是最干净的方法:

template<bool b>
using sfinae = typename std::enable_if< b, bool >::type;

template<class T,
sfinae<isAType<T>::value> =true
>
void function( T& t )
{
}

我不会为 sfinae 别名烦恼,但是摆脱 typename 让它在 中变得值得.

请注意,=true 部分是必需的,但如果它是 =false,则意味着同样的事情。

这里发生的事情是我们定义了一个非类型模板参数,其类型仅在测试通过时才存在。然后我们给它一个默认值。

我发现这种技术读起来最像传入的 我是说 我是说 C++的概念特性。

关于c++ - SFINAE+类型特征的自动类型推导失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47461558/

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