如何使用no-typename参数专门化模板?

时间:2017-10-30 10:09:42

标签: c++ templates

我有这个模板结构,我需要为不同的数据类型编写不同的函数:

template <typename T, int _len>
struct Field {
        T data;
        int len;

        Field(){
            len = _len;
        }
};

我如何将它专门用于几种类型?像这样:

template <>
void Field<int,int> {
...
    void function() {
    ...
        specialization for int
    ...
    } 
...
};

template <>
void Field<char,int> {
...

    void function() {
    ...
        specialization for char
    ...
    } 
...
};

template <>
void Field<String,int> {
...
    void function() {
    ...
        specialization for String
    ...
    } 
...
};

我接受任何类型的建议,我甚至可以考虑使用其他类型的数据结构。我喜欢使用模板来定义&#34; Fields&#34;像这样:

Field <String, 10> myField

谢谢!

1 个答案:

答案 0 :(得分:5)

专业化与继承不同。当你专攻时你必须重新声明一切,它被认为是一种不同的类型。

您可以使用包含公共属性和方法的基础模板化结构,然后创建从其继承的模板:

#include <iostream>

template<typename T, int _len>
struct FieldBase {
  T data;
  int len;

  FieldBase() {
    len = _len;
  }
};

template<typename T, int _len>
struct Field : public FieldBase<T, _len> {};

template<int _len>
struct Field<int, _len> : public FieldBase<int, _len> {
  void function() {
    std::cout << "int " << this->len << std::endl;
  }
};

template<int _len>
struct Field<char, _len> : public FieldBase<char, _len> {
  void function() {
    std::cout << "char " << this->len << std::endl;
  }
};

int main()
{
  Field<int, 5> f_int;
  Field<char, 10> f_char;

  f_int.function();
  f_char.function();

  return 0;
}

输出:

  

int 5

     

char 10