32

多くの関数を持つテンプレート クラスがあり、それらを特殊化して、そのうちのいくつかだけを変更し、他のものは基本テンプレート クラスで指定されているとおりに維持したいとします。

どうやってやるの?

以下は私が達成したいことですが、解決策は良くありません.asの特殊化を参照することができないためですint–その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

26

2 つのテンプレート クラスを使用するだけです。

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 に答える