2017-05-08 8 views
1

私が作成しているコンストラクタテンプレートでは、クラステンプレートのインターフェイスに静的アサートをしたいと思います。状況の基本的な(非コンパイル)の例は次のとおりです。私の最高の推測では、バズに機能を追加しているが、これはテンプレート化することができないので、クラステンプレートへのインターフェイスの静的アサート

class Baz 
{ 

} 

template<typename T> 
class Bar: public Baz 
{ 

} 

template<typename T> 
class Qux: public Baz 
{ 

} 

class Foo 
{ 
    template<typename T> 
    Foo(T typePar , Baz& baz) 
    { 
     // here I would like to assert that Baz is an interface to a class 
     specialized on T 
    } 
} 

、私は今どのように私はでそれを呼び出すことができませんコンパイル時。

+1

'Baz'が実際に' Bar 'または' Qux 'への参照であることをコンパイル時にチェックしたいのですか?これは、動的な型の 'baz'が実行時に異なるものになる可能性があるため、実行できません。 – TartanLlama

+0

'Baz&'をテンプレートパラメータに変更してチェックしますが、 'Baz'をコンストラクタに渡すことができませんでした。最初にキャストする必要があります。 – TartanLlama

+0

私はあなたが何を意味するかを見ます。それをテンプレートパラメータに変更することは、私のための選択肢ではありません。それでは、私はこの静的なアサーションを忘れてしまいます – laurisvr

答えて

-1

あなたは「... BazTに特化したクラスへのインタフェースであることを主張」したい場合は、私は、あなたがすることができ、「... TBazのスーパークラスであることを主張」としてこれを解釈する可能性がある場合static_assert以下、このように:

class Foo 
{ 
    template<typename T> 
    Foo(T typePar , Baz& baz) 
    { 
     // assert that T is a base class of Baz 
     static_assert(std::is_base_of<T, Baz>::value, "T is not a base class of Baz."); 
    } 
}; 

このためにも推移から、Bazの任意のサブクラスにも当てはまる(TBazのスーパークラスである場合、TBazのすべてのサブクラスのスーパークラスでもあります)。

ただし、関数引数bazで静的に何もアサートできないことに注意してください。関数引数はconst式ではないためです。

+0

私は、あなたの解釈が正しいとは思わない.Bazは何も継承していないことが分かる。OPは、Bazの動的型がBar またはQux であることを保証したいが、コンパイル時にそれをしないでください。 – TartanLlama

関連する問題