模板类专业化具有成员变量和方法的默认值

Template class specialization with default value for member variables and methods

本文关键字:变量 方法 默认值 成员 专业化      更新时间:2023-10-16

我有一个类模板:

template<typename T>
struct DefaultPattern {
  using type = int;
  static int CalculateValue(const T& input) {
    return 0;
  }
};

对于每种类型的T,我都会有一个专业化。问题在于,在专业类中,我需要定义DefaultPattern中定义的所有成员变量和方法,即使它们可能具有与DefaultPattern中的值相同的值。这是一个示例:

// A specialization for int.
template<>
struct DefaultPattern<int> {
  // Same as DefaultPattern but I need to define it again.
  using type = int;
  static int CalculateValue(const int& input) {
    return input + 2;
  }
};

有一种方法,以便当我进行专业化时,我只需要定义那些与DefaultPattern不同的成员?

是否有一种方法,以便当我进行专业化时,我只需要定义那些与DefaultPattern不同的成员?

可能的解决方案是一种自我传播:您的专业化可以继承形式的通用模板。请注意,要从通用模板继承,规范化使用特定的实例化(例如,T = long在下面使用(。

例如:

template <>
struct DefaultPattern<int> : public DefaultPattern<long>
 {
   static int CalculateValue (int const & input)
    { return input + 2; }
 };

因此,DefaultPattern<int>DefaulPattern<long>(或DefaultPattern<std::string>或其他东西(继承type = int,然后重新定义CalculateValue()

以下是一个完整的工作示例:

#include <iostream>
#include <type_traits>
template <typename T>
struct DefaultPattern
 {
   using type = int;
   static int CalculateValue (T const &)
    { return 0; }
 };
template <>
struct DefaultPattern<int> : public DefaultPattern<long>
 {
   static int CalculateValue (int const & input)
    { return input + 2; }
 };
int main ()
 {
   static_assert( std::is_same<DefaultPattern<int>::type, int>{}, "!" );
   std::cout << DefaultPattern<long>::CalculateValue(1L) << std::endl;
   std::cout << DefaultPattern<int>::CalculateValue(1) << std::endl;
 }