如何解决两种模板代码模式之间的区别,其中一种情况下分配了一个数字,而另一种情况下则使用了关键字typename
在下面的代码中,以下两个模板行之间有什么区别。
> 1. template<class T,std::enable_if_t<std::is_integral<T>::value,int> = 0> > 2. template<class T,typename = std::enable_if_t<std::is_integral<T>::value>>
以上两行都工作正常,我只是想知道使用它们的优势/劣势。
#include <type_traits>
#include <iostream>
template<class T,int> = 0>
//template<class T,typename = std::enable_if_t<std::is_integral<T>::value>>
int onlyOnInt(T a,T b)
{
return a+b;
}
int main()
{
onlyOnInt(1,2);
}
解决方法
如果您编写一个函数,它们都可以正常工作。
但是当您需要两个替代功能时,
template <typename T,typename = std::enable_if_t<true == std::is_integral_v<T>>>
void foo (T const &)
{ std::cout << "is integral" << std::endl; }
template <typename T,typename = std::enable_if_t<false == std::is_integral_v<T>>>
void foo (T const &)
{ std::cout << "isn\'t integral" << std::endl; }
您会通过这种方式得到编译错误
template <typename T,std::enable_if_t<true == std::is_integral_v<T>,int> = 0>
void foo (T const &)
{ std::cout << "is integral" << std::endl; }
template <typename T,std::enable_if_t<false == std::is_integral_v<T>,int> = 0>
void foo (T const &)
{ std::cout << "isn\'t integral" << std::endl; }
有效。
原因?
考虑您正在使用SFINAE,即替换失败不是错误。
重点是替代。
第一种方法,当您致电
foo(0)
替代带来
template <typename T,typename = void>
void foo (T const &)
{ std::cout << "is integral" << std::endl; }
template <typename T,typename>
void foo (T const &)
{ std::cout << "isn\'t integral" << std::endl; }
也就是说...您有两个具有相同签名的函数(默认的模板参数不会更改函数的签名),并且会碰撞调用它。
第二种方式只有你
template <typename T,int = 0>
void foo (T const &)
{ std::cout << "is integral" << std::endl; }
因为第二个函数中的替换失败使该函数不可用并被丢弃。因此,您只有可用的功能,没有碰撞。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。