2016-08-11 4 views
2

私はEclipseでテンプレートパラメータについての前提を設定するにはどうすればよいですか?

template <typename T> class Foo : public T { /* ... */ } 

を持っていると私はBarのサブクラスですT秒でそれをインスタンス化します。それが役に立ったら、私は静的にすることができます。

Eclipse CDTはTが「本当に」と認識しません。Barです。私はそれについて文句を言うことはできません - しかし、私はそれを理解することはできますか?つまり、私はIndexerに、Fooの基底クラスとしてクラスBarのメソッドと型を探すように何とかしてもらえますか?

答えて

0

これは本当に良い質問です!

現在、テンプレートには特定の型のサブクラスである引数のみがインスタンス化されることをEclipseに知らせる方法はありません。

しかし、あなたのコードでこの関係を表現できるようになるC++言語機能もあります。Conceptsも同様です。コンパイル時に評価タイプのブール関数、 -

概念は、彼らがタイプ述語と考えることができ概念を、満足しなければならないような制約テンプレートパラメータにあなたを可能にします。これが唯一のBarから派生しているタイプで満足している概念DerivedFromBarを定義

template <typename T> 
concept bool DerivedFromBar = std::is_base_of<Bar, T>::value; 

はたとえば、次のようなコンセプトを書くことができます。

次に、あなたのクラステンプレートの定義では、この概念を使用することができます。

template <DerivedFromBar T> class Foo : public T { /* ... */ } 

は、テンプレートパラメータTを宣言する代わりに、通常のtypenameDerivedFromBarの使用に注意してください。これはTDerivedFromBarを満たすように制約されているコンパイラに指示します。

このようにコードを記述すると、テンプレートの中にタイプTというオブジェクトのメソッドを呼び出すときに、EclipseはBarのメンバーに自動補完提案を提供することを可能にする推論を原理的に行うことができます。

概念は、現在、MSVCと打ち鳴らすが、それを実装する上で作業など、他のコンパイラで、GCCによってサポートされています。

Bug 492682トラックの概念は、Eclipse CDTでサポートされています。より良い自動補完のためのコンセプトを活用することは、フォローアップ機能になります。

関連する問題