【发布时间】:2016-07-11 10:59:10
【问题描述】:
language reference of std::enable_if at cppreference 中包含以下注释
备注
一个常见的错误是声明两个不同的函数模板 仅在它们的默认模板参数中。 这是非法的,因为 默认模板参数不是函数模板的一部分 签名,并声明两个不同的函数模板 相同的签名是非法的。
在下面示例中的模板函数中,在我看来这种情况发生了。即,两个模板函数onlyForDerivedObjects(...) 似乎(在我看来)仅在它们的默认模板参数上有所不同。我意识到我在这里遗漏了一些东西,希望有人可以向我解释这一点,或者指出我可能会为自己找到顿悟的方向。
-
问题: W.r.t.上面的引用,为什么下面的例子编译和运行良好:当我认为它产生两个模板函数的情况时,我是否错误地分类了下面的模板函数中的
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;
}
【问题讨论】:
标签: c++ templates c++11 enable-if