C++11 - enable_if - 类定义之外的函数实现

Posted

技术标签:

【中文标题】C++11 - enable_if - 类定义之外的函数实现【英文标题】:C++11 - enable_if - function implementation outside of class definition 【发布时间】:2017-04-29 10:10:05 【问题描述】:

如何使用具有 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(即在内联文件中)?

【问题讨论】:

【参考方案1】:

您在返回类型上使用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);

【讨论】:

类定义中的返回类型名中不应该也有 void 吗? @MatrinPerry 对不起,我错过了。它仍然有效,因为void 是默认值。如果返回类型是别的东西,例如int,它会坏掉的。

以上是关于C++11 - enable_if - 类定义之外的函数实现的主要内容,如果未能解决你的问题,请参考以下文章

SWIG C++/Python 绑定和支持带有 std::enable_if 的条件成员

对成员变量使用 std::enable_if 或类似方法

std::enable_if与boost::enable_if,boost::enable_if_c的区别与联系

在类定义之外定义一个方法?

enable_if 与复制/移动赋值运算符

std::enable_if 在模板参数上确定 STL 容器