13

テンプレート化されたクラス A<T, int> と 2 つの typedef A<string, 20> と A<string, 30> があります。A<string, 20> のコンストラクターをオーバーライドするにはどうすればよいですか? 以下は機能しません。

template <typename T, int M> class A;
typedef  A<std::string, 20> one_type;
typedef  A<std::string, 30> second_type;


template <typename T, int M>
class A {
public:
  A(int m) {test= (m>M);}

  bool test;

};


template<>
one_type::one_type() { cerr << "One type" << endl;}

クラス A<std::string,20> に、他のクラスではできないことをさせたいと思います。コンストラクター A:A(int) を変更せずにこれを行うにはどうすればよいですか?

4

7 に答える 7

14

唯一できないことは、を使用しtypedefてコンストラクターを定義することです。それ以外は、次のA<string,20>ようにコンストラクターを特殊化する必要があります。

template<> A<string,20>::A(int){}

A<string,20>generic とは異なるコンストラクターが必要な場合は、クラスA全体を特殊化する必要があります。A<string,20>

template<> class A<string,20> {
public:
   A(const string& takethistwentytimes) { cerr << "One Type" << std::endl; }
};
于 2009-12-14T19:46:37.650 に答える
7

公にアクセスできるようにすることが本当に意図されていると仮定するとA::test、次のようなことができます。

#include <iostream>


template <int M>
struct ABase
{
  ABase(int n) : test_( n > M )
  {}

  bool const test_;
};


template <typename T, int M>
struct A : ABase<M>
{
  A(int n) : ABase<M>(n)
  {}
};


template <typename T>
A<T, 20>::A(int n)
  : ABase<20>(n)
  { std::cerr << "One type" << std::endl; }

タイヤを蹴る:

int main(int argc, char* argv[])
{
  A<int, 20> a(19);
  std::cout << "a:" << a.test_ << std::endl;
  A<int, 30> b(31);
  std::cout << "b:" << b.test_ << std::endl;
  return 0;
}
于 2009-12-14T19:21:33.140 に答える
1

どうですか :

template<typename T, int M, bool dummy = (M > 20) >
class A {
public:
  A(int m){
      // this is true
  }

};

template<typename T, int M>
class A<T,M,false> {
public:
    A(int m) {
    //something else
    }
};
于 2010-12-13T15:59:22.937 に答える
1

現在のアプローチではできません。one_type は、特定のテンプレートの特殊化のエイリアスであるため、テンプレートに含まれるコードは何でも取得します。

one_type に固有のコードを追加する場合は、次のように A 特殊化のサブクラスとして宣言する必要があります。

  class one_type:
    public A<std::string, 20>
  {
    one_type(int m)
      : A<str::string, 20>(m)
    {
      cerr << "One type" << endl;
    }
  };
于 2009-12-14T19:10:57.190 に答える
0

この状況で思いついた最善の解決策は、「コンストラクタヘルパー関数」を使用することです。

template <typename T, int M> class A;
typedef  A<std::string, 20> one_type;
typedef  A<std::string, 30> second_type;

template <typename T, int M>
class A {
private:
  void cons_helper(int m) {test= (m>M);}
public:
  A(int m) { cons_helper(m); }

  bool test;
};

template <>
void one_type::cons_helper(int) { cerr << "One type" << endl;}
于 2016-11-07T23:05:07.680 に答える