1

これを英語でどのように表現するかは正確にはわかりませんが、次のようなことをしたいと思います。

template <class T>
class derived: public T
{ blah };

基本的に、テンプレートクラスがありますが、テンプレートで指定されているクラスから新しいクラスを派生させていますか?つまり、コンパイル時にクラスを必ずしも知っているとは限りません。

これも可能ですか?
もしそうなら、これのセマンティクスは何ですか?

たとえば、「親」クラスを作成しようとしているとします。この例では、それが木の親であるとしましょう。ツリーの親は、ツリー自体です(したがって、ツリーから継承します)が、子ツリーへの参照のベクトルもあります。
ただし、親クラス自体はツリーである必要はありません。次のようなものを書くことができるように、それはどのクラスでもかまいません。

Parent<tree> treeParent;
Parent<shrub> shrubParent;
4

5 に答える 5

3

はい。それは可能です。そうしてみてください。

コンパイル時にクラスを知っているとは限りません。

「クラステンプレートを定義する時点でクラスを必ずしも知っているとは限らない」という意味だと思います

コンパイルするまでに、すでにクラス テンプレートを定義し、それをコードで使用して、テンプレート引数をそれに渡しています。つまり、コンパイル時にクラス (つまり、テンプレート引数) を知っているということです。として使用するクラスがわからない場合はbase、コードをコンパイルすることさえできません。

于 2012-01-20T18:16:49.317 に答える
3

これは確かに可能であり、ポリシーベースの設計で一般的に使用されています。

この信じられないほど不自然な例のように:

template<typename OutputPolicy>
struct Writer : public OutputPolicy {
  using OutputPolicy::print;
  void write(const std::string&) {
    //do some formatting etc.
    print(string);
  }
};

class StdoutPolicy {
public:
  set_linebreaks(const std::string&);
protected:
  void print(const std::string&);
};

ポリシーのパブリック メソッドには、 からアクセスできますWriter。そうすることで、ポリシーが使用されているクラスを追加のメソッドで装飾できます。

于 2012-01-20T18:23:37.557 に答える
0

これは非常に一般的であり、独自の名前が付けられている可能性があります: Curiously recurring template pattern. Curiously recurring template pattern に関する Wikipeida エントリを参照してください。

于 2012-01-20T20:04:58.710 に答える
0

このような:

#include <iostream>
using namespace std;

template<typename T>class classTemplateBase
{
    public:
       T value;
       classTemplateBase(T i)
       {
          this->value = i;
       }
       void test()
       {
          cout << value << endl;
       }
};

class classTemplateChild : public classTemplateBase<char>
{
    public:
       classTemplateChild( ): classTemplateBase<char>( 0 )  // default char is NUL
       {
          ;
       }

       classTemplateChild(char c): classTemplateBase<char>( c )
       {
          ;
       }
       void test2()
       {
          test();
       }
};

int main()
 {
      classTemplateBase <int> a( 42 );
      classTemplateChild b( 'A' );

      a.test();   // should print "42"
      b.test();   // should print "A"
      b.test2();  // should print "A"

  return 0;
 }
于 2012-01-20T18:30:13.733 に答える