[英]Default template argument when using std::enable_if as templ. param.: why OK with two template functions that differ only in the enable_if parameter?
在cppreference的std::enable_if
语言参考中,包括以下注释
笔记
一个常见的错误是声明两个仅在默认模板参数上不同的函数模板。 这是非法的,因为默认模板参数不是函数模板签名的一部分,并且声明具有相同签名的两个不同函数模板是非法的。
在下面示例中的模板函数中,在我看来,这种情况发生了。 即,这两个模板函数onlyForDerivedObjects(...)
似乎(对我而言)仅在它们的默认模板参数上有所不同。 我意识到我在这里遗漏了一些东西,希望有人可以向我解释这一点,或者指出我可以为自己找到顿悟的方向。
typename std::enable_if ...
以下模板函数中的一部分,它们仅不同在他们的默认模板参数中?基类和派生类:
class BaseA
{
public:
int getInt() const { return 21; };
};
class DerivedA : public BaseA {};
class BaseB
{
public:
int getAnotherInt() const { return 33; };
};
class DerivedB : public BaseB {};
具有以下模板函数
/* template functions that, seemingly, only differ in their
default template arguments? */
template< class T,
typename std::enable_if<std::is_base_of<BaseA, T>::value>::type* = nullptr >
int onlyForDerivedObjects(const T& obj)
{
return 2*obj.getInt();
}
template< class T,
typename std::enable_if<std::is_base_of<BaseB, T>::value>::type* = nullptr >
int onlyForDerivedObjects(const T& obj)
{
return 3*obj.getAnotherInt();
}
编译并运行良好( g++ -Wall -std=c++11 ...
, g++ 4.9.3
)
#include <iostream>
#include <type_traits>
/* ... classes and template functions as above */
/* template argument deduction seems to work fine */
int main()
{
DerivedA* objA = new DerivedA();
DerivedB* objB = new DerivedB();
std::cout << onlyForDerivedObjects(*objA) << std::endl; // 42
std::cout << onlyForDerivedObjects(*objB) << std::endl; // 99
return 0;
}
笔记
一个常见的错误是声明两个仅在默认模板参数上不同的函数模板。 这是非法的,因为默认模板参数不是函数模板签名的一部分,并且声明具有相同签名的两个不同函数模板是非法的。
您的函数不仅在默认模板参数方面有所不同,而且在模板参数方面也有所不同,因此具有不同的签名。
在这两种情况下,默认模板参数都是nullptr
,但第二个模板参数在每种情况下都不同。
常见的错误是:
template <typename T, typename = std::enable_if_t<cond>>
void foo()
template <typename T, typename = std::enable_if_t<!cond>>
void foo()
两者都声明
template <typename, typename>
void foo();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.