2012-12-25 19 views
9

渡されたテンプレートパラメータがFooの子であるという制限を適用したいとします。テンプレートパラメータの子X制限を強制する方法はありますか?

これを型特質によって強制する方法はありますか?コンパイル時にstatic_assertのエラーが発生する可能性があります。

以下のコードでは、それを2つの(別々の)質問にしましょう。

  1. My_Limited_Template<Bar>のみをコンパイルできます。
  2. My_Limited_Template<TBar>のみをコンパイルできます。

EDIT私が悪いの命名をお詫び申し上げます :TBarTBazを目的に非テンプレートクラスであることを意味しています。私はちょうど1

パートのクラスから明確にするために名前の前にTを添付CODE

struct Foo { };    // no 
struct Bar : public Foo { }; // yes 
struct Baz { };    // no 

template< typename T > 
struct TFoo { };      // no 
struct TBar : public TFoo<TBar> { }; // yes 
struct TBaz { };      // no 

template< typename T > 
struct My_Limited_Template 
{ 
    // Part One: 
    // My_Limited_Template<Foo> // disallow 
    // My_Limited_Template<Bar> // allow 
    // My_Limited_Template<Baz> // disallow 
    // 
    // Part Two: 
    // My_Limited_Template<TFoo<int>> // disallow 
    // My_Limited_Template<TBar>  // allow 
    // My_Limited_Template<TBaz>  // disallow 
}; 
+1

したがって、2番目の部分は*「TFooからCRTPを使用して派生したパラメータのみ」*ですか? – jrok

+0

@jrok +1もしあなたがCRTPを含むことができれば、それはもっと良いだろうが、それが可能かどうかわからない! – kfmfe04

+0

私が意味していたのは、あなたがTBarを派生させるときにCRTPを使用したことです。それはあなたが許可したい 'TFoo'子どもの唯一の種類ですか、' struct X:TFoo {}; 'のようなものを持っていていいですか? – jrok

答えて

1

私は変更することを確認し、あなたがTBarTBasの定義にエラーをしたと仮定正しい。

+1

私はあなたの次の部分が正しいとは思わない(どうしてあなたの質問が間違っていると思われているのですか?)。 IIUCの場合、 'T'は' TFoo'のいくつかの(特定されていない)インスタンス化のサブクラスである必要がありますが、 'T'は特に' TFoo 'のサブクラスである必要があります。 – Mankarse

関連する問題