2011-01-03 9 views
2

私はテンプレートクラスを持っています。その中には、通常の関数があります。しかし、私はテンプレートクラスの特定のインスタンシエーションに対してのみ、この通常の機能を有効にしたいと思います。私はboost :: enable_ifを見て、それは私の必要性に正確に/私が自分の必要性のためにそれを使用することができないかもしれないかもしれません。テンプレートクラス関数の選択的有効化

typedef boost::mpl::vector< bool, int, double > CheckTypes; 

template<class X> 
class P 
{ 
    void init(int x, 
     typename boost::enable_if< boost::mpl::contains<CheckTypes, X> >::type* dummy = 0); 
}; 

誰かがこの問題の解決方法を教えていただけますか?重要なことは、ソリューションが呼び出しコードから何も期待してはならないことです。クラスは明示的にインスタンス化されます。

ありがとう、 Gokul。

+0

あなたが意味するか「有効」と言う「あなたがタイプX、Y、またはZをインスタンス化しない限り、この機能は存在すらしないのですか?」 – templatetypedef

+0

私の例ではbool、int、doubleの関数しか存在しません。出来ますか? – Gokul

+0

enable_ifは実際にうまく動作するはずです。 –

答えて

2

enable_ifは、通常、機能の異なる定義を区別するために使用されます。ある意味では、より強力なオーバーロード方法です。

あなたの条件が成立する場合にのみ、機能を有効にし、あなたがinitの単一の定義を持っているので、それ以外の場合はコンパイルエラーを与えるしようとしているようです。それが正しい場合は、代わりにBOOST_STATIC_ASSERT(またはstatic_assert、C++ 0x)を調べるとよいでしょう。

+0

私は上記の答えに対するコメントでそれを明確にしました。手伝ってくれますか ?ありがとう。 – Gokul

+0

あなたは何をしようとしているのか説明できますか?私の推測では、 'init'コードは' X'が 'CheckTypes'の一つである場合にのみ動作しますが、他の型とも' P'をインスタンス化できるようにしたいと思います。この場合、 'CheckTypes'以外の型に対して' disabled_if'dである 'init'を定義し、何もしません。 –

2

静的アサーションを使用することもできます。テンプレートクラスのメンバー関数は遅延的にインスタンス化されます。つまり、呼び出されない場合、それらのコードは生成されません。これは、bool、int、またはdoubleのインスタンス化のために呼び出されることが予想される通常の関数を記述し、この関数に静的なアサーションを挿入して、実際にそうであることを確認することができることを意味します。

テンプレートを明示的にインスタンス化しているため、これを行うことができない場合、別のオプションは、余分なメンバー関数を含む3つのタイプのテンプレート特殊化を提供することです。これにより、関数を明示的に含めるか除外することができますが、追加のコーディングが必要になることがあります。

また、この余分な関数をクラスのメンバー関数ではなく、代わりに空き関数にすることも考えられます。たとえば、だけではなく、これら3つのケースのために存在するinit機能を有していると、このように見えるの三つの機能の定義を検討:その方法

void Init(P<int>& toInit); 
void Init(P<double>& toInit); 
void Init(P<bool>& toInit); 

を、任意のタイプのためにコンパイルされない可能性のあるコードはではありませんその代わりにこれらの機能に扇動されています。次に、これらの3つの機能を、テンプレートそのものであるヘルパー機能の観点から実装することができます。

+0

Hmmm ...実際には、私はこのクラスを明示的にインスタンス化しましたが、私は関数を全く呼び出すわけではありません。それでもコンパイル時エラーが報告されます。これはMSVC 2010です。理由は何ですか? – Gokul

+1

テンプレートを明示的にインスタンス化する(つまり、 'テンプレートクラスP ;の効果に何かを書き出す)、メンバー関数のすべてを熱心にインスタンス化します。テンプレートを暗黙的にインスタンス化する(例えば、P の変数を宣言するなど)、これを行うべきではありません。明示的なインスタンス化の理由はありますか? – templatetypedef

+0

うん!!!コンパイル時間を節約するために行われました。このモジュールはどこにでも含まれているので... – Gokul

関連する問題