通过专业化排除类成员

时间:2016-11-30 18:47:50

标签: c++ c++11 templates clang++

我有基类模板,我正在创建另一个类,这是我的基类的专用版本。我知道如何从特定的专业化案例中排除某些方法,但有没有可能为班级成员制作这些方法?示例代码,我想要实现的目标:

template<typename T>
class Base {
  This variable exists only when T==integer VARIABLE;
}

template <Typename T>
WithVariable = using Base<int>;

template <Typename T>
Without = using Base<double>

我认为我应该以某种方式使用std :: enable,但是当我不想要那个变量时,使用它可以制作类型为#34; void&#34;的VARIABLE。这仍然不是我想要实现的情况。

4 个答案:

答案 0 :(得分:2)

你可以在没有不想要的成员的情况下专攻课程吗?

template <typename T>
class Base {
public:
  T t;
};

template <>
class Base<int> {
};

int main() {
  Base<int> foo;
  foo.t = 42; // Error: no member named 't' in 'Base<int>'
}

答案 1 :(得分:2)

一种可行的方法是有条件地继承。看看:

print

和用法:

print

您也可以为您的类型编写显式特化,但如果您有一组类型(如整数或从特定基础派生的类型),其成员应该与一般类型不同,则此解决方案可能会有所帮助。

答案 2 :(得分:0)

您可以使用基础用于使用SFINAE的基础

#include <type_traits>

template <typename, typename = void>
struct base_of_base;

template <typename T>
struct base_of_base<T, typename std::enable_if<std::is_integral<T>::value>::type>
 { int var; };

template <typename T>
struct base_of_base<T, typename std::enable_if<!std::is_integral<T>::value>::type>
 { };

template <typename T>
class base : public base_of_base<T>
 { };

int main()
 {
   base<int>     bi;
   base<long>    bl;
   base<float>   bf;
   base<double>  bd;

   bi.var = 1; // OK
   bl.var = 1; // OK
   // bf.var = 1; // error: ‘class base<float>’ has no member named ‘var’
   // bd.var = 1; // error: ‘class base<double>’ has no member named ‘var’
 }

答案 3 :(得分:0)

{{1}来自班级专业的功能怎么样?

delete