如何使用具有enable_if?
的模板实现功能class Test
{
public:
Test(){}
~Test(){}
template<typename T, typename std::enable_if<std::is_integral<T>::value>::type>
void do_something(T v);
template<typename T, typename std::enable_if<std::is_floating_point<T>::value>::type>
void do_something(T v);
};
如何为类定义之外的不同类型(即内联文件)实现do_something
?
答案 0 :(得分:3)
您在返回类型上使用enable_if
。这在cppreference:
一个常见的错误是声明两个仅在默认模板参数上有所不同的函数模板。这是非法的,因为默认模板参数不是函数模板签名的一部分,并且声明具有相同签名的两个不同函数模板是非法的。
#include <iostream>
#include <type_traits>
class Test
{
public:
Test(){}
~Test(){}
template<typename T>
typename std::enable_if<std::is_integral<T>::value, void>::type
do_something(T v);
template<typename T>
typename std::enable_if<std::is_floating_point<T>::value, void>::type
do_something(T v);
};
template<typename T>
typename std::enable_if<std::is_integral<T>::value, void>::type
Test::do_something(T v) { std::cout << "Integral\n"; }
template<typename T>
typename std::enable_if<std::is_floating_point<T>::value, void>::type
Test::do_something(T v) { std::cout << "Floating point\n"; }
int main()
{
Test t;
t.do_something(1);
t.do_something(3.14);
}