使用SFINAE选择性地实例化模板的成员函数

时间:2018-06-14 05:15:02

标签: c++ templates template-meta-programming sfinae crtp

所以在模板类中,我试图根据静态提供的一些信息来实例化不同的成员。在下面的模板中,如果某些条件成立,则selectiveMember包含在SelectiveClass中,否则,模板将在没有selectiveMember的情况下实例化,但仍包含foo。< / p>

template<typename T>
struct SelectiveClass{

  void foo(){...}

  template<condition_check<T>::type=0>
  void selectiveMember{...}
}

但是,如果不满足条件,这种实现将丢弃整个类。然而,使用CRTP技术,我们可以达到目的。

template<typename T>
struct SelectiveClass: Specialize<T>{   
  void foo(){...}
}
template<typename T>
struct Specialize{
  template<condition_check<T>::type=0>
  void selectiveMember{...}
}

但是使用这种技术,每个选择性成员都需要另一个专门的继承。

所以我的问题是:是否有更优雅的方式来允许这种选择性成员模板?

1 个答案:

答案 0 :(得分:2)

您的enable_if无法按您希望的方式工作的原因是因为它没有在立即上下文中使用(例如,参见here)。但是,如果在selectiveMember函数中插入默认模板参数,则可以实现所需的功能。在下面的示例中,我使用的是condition的具体示例,但是您可以用自己的示例替换它。

#include <type_traits>


template<typename T>
struct SelectiveClass{

  void foo(){}

  template <class X = T, std::enable_if_t<std::is_integral<T>::value, X>* = nullptr>
  void selectiveMember(){}
};

using test_int = SelectiveClass<int>;
using test_double = SelectiveClass<double>;

int main() {

    test_int x;
    test_double y;

    x.selectiveMember();
//    y.selectiveMember(); fails to compile as expected
}