将方法添加到特定类型的模板化类

Add a method to templated class for specific type

本文关键字:类型 方法 添加      更新时间:2023-10-16

例如,我有一个类模板:

template <typename T>
class base {
public:
   void set(T data) { data_=data; }
private:
T data_;
};

对于某种类型,我想添加一个函数,但也要添加模板类中的函数。

template <>
class base<int>{
public:
   void set(int data) { data_=data; }
   int get(){ return data_;} //function specific to int
private:
    int data_;
}

如何在不复制模板类的所有成员的情况下执行此操作?

使用继承:

template <typename T> struct extra {};
template <> struct extra<int> {
public:
    int get() const;
};
template <typename T>
class base : public extra<T> {
    friend class extra<T>;
public:
   void set(T data) { data_=data; }
private:
    T data_ = 0;
};
int extra<int>::get() const{ return static_cast<const base<int>*>(this)->data_;}

演示

您可以通过

使用 type_traits 中的enable_if来执行此操作,以便仅在模板参数int时启用 get 函数。下面显示了一个示例。

#include <type_traits>
template <typename T>
class base {
public:
  template <typename X=T,
            std::enable_if_t<   std::is_same<X,typename T>::value
                             && std::is_same<X,int>::value, bool> = false>
  int get() { return data_; }
  void set(T data) { data_=data; }
private:
  T data_;
};
相关文章: