32

假设我有一个包含很多函数的模板类,并且我想对它们进行专门化以仅更改其中的一些,并保持其他的与基本模板类中指定的完全一致。

我怎样才能做到这一点?

以下是我想要实现的目标,但解决方案并不好,因为它不允许我引用intas的专业化Base<int>——我需要使用IntSpec它。

#include <iostream>

using namespace std;

template<typename T>
struct Base
{
  void print1() {cout << "Base::print1" << endl;};
  void print2() {cout << "Base::print2" << endl;};
};

struct IntSpec : public Base<int>
{
  void print2() {cout << "Base<int>::print2()" << endl;};
};

int main()
{
  Base<double> d;
  // Base<int> i;  <-- I want this kind of instantiation
  IntSpec i;

  d.print1();
  d.print2();
  i.print1();
  i.print2();
}

输出是:

Base::print1
Base::print2
Base::print1
Base<int>::print2()
4

3 回答 3

45

Nicol 的解决方案效果很好,但这是另一种选择:

template<typename T>
struct Base
{
  void print1() {cout << "Base::print1" << endl;};
  void print2() {cout << "Base::print2" << endl;};
};

template<>
void Base<int>::print2() {cout << "Base<int>::print2()" << endl;};

这样你就可以只专门化特定的成员函数,并且仍然使用那些你没有专门化的(在这种情况下,print1)没有任何问题。所以现在你可以像你想要的那样使用它:

Base<int> i;
i.print1();
i.print2(); // calls your specialization

演示在这里

于 2013-06-12T03:30:08.037 回答
26

你只需要使用两个模板类:

template<typename T>
struct CommonBase
{
  void print1() {cout << "Base::print1" << endl;};
  void print2() {cout << "Base::print2" << endl;};
};

template<typename T>
struct Base : public CommonBase<T>
{
};

template<>
struct Base<int> : public CommonBase<int>
{
  void print2() {cout << "Base::print2" << endl;};
};

你总是使用Base,而不是CommonBase

于 2013-06-12T02:05:57.630 回答
4

另一种解决方案是在要重新定义的函数中添加一个间接级别,即

template<typename T>
struct foo
{
    template<typename T2>
    void bar_impl()
    {
        //generic function
    }

    void bar()
    {
        bar_impl<T>();
    }
};

然后,您可以为每种类型单独专门化每个功能,或者根据需要专门化整个类型。

于 2013-06-12T02:09:23.413 回答