通过专业化将班级成员排除在外

Exclude class member by specialization

本文关键字:成员 排除 专业化      更新时间:2023-10-16

我有基类模板,我正在做其他类,这是我的基类的专业版本。我知道如何将某些方法排除在特定的专业案例之外,但是对于班级的成员有可能做到这一点吗?示例代码,我想实现的目标:

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 ::启用,但是当我不想要该变量时,可以使用它来制作" void"类型的变量。那仍然不是我要实现的情况。

您可以在没有不必要的成员的情况下专业化课吗?

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>'
}

这样做的一种可能的方法是有条件继承。看看:

struct BaseWithVariable {
    int n {42};
};
struct BaseNoVariable {};

template <typename T>
struct Base : std::conditional<std::is_same<T, int>::value, BaseWithVariable, BaseNoVariable>::type {};

和用法:

Base<int> b {};
Base<double> d {};
std::cout << b.n << std::endl;
std::cout << d.n << std::endl; // error

您还可以为您的类型编写明确的专业化,但是如果您有一组类型(例如来自特定基础的整数或类型),该类型的成员应该与一般类型不同,则此解决方案可能会有所帮助。

您可以使用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’
 }

delete从类的专业化中启用函数?

template <typename T>
class Base {
public:
  void notUseful();
};
template<typename T>
void Base<T>::notUseful(){
  std::cout << "not useful" << std::endl;
  return;
}
template <>
void Base<int>::notUseful() = delete;