2016-05-06 5 views
1

以内に私はクラスがメンバ関数を持っているなら、私に判断するためにsolution hereを単純化していますテンプレートSFINAEはconditional_t

template<typename T> 
struct HasTest{ 
    template<typename R, typename S = decltype(declval<R>().test())> static true_type Test(R*); 
    template<typename R> static false_type Test(...); 
    using def = decltype(Test<T>(0)); 
}; 

私はconditional_tの状態でHasTest<T>::def::valueを使用する必要があります。問題はかなりの数の関数でこれを行う必要があることです。関数ごとに構造体を宣言する必要があるので、条件内でSubstitution Fail Is Not An Error(SFINAE)を実行する方法を見つけようとしていました。何かのように:

conditional_t<struct { template<typename R, typename S = decltype(declval<R>().test())> static true_type Test(R*); template<typename R> static false_type Test(...); using def = decltype(Test<T>(0)); }::def, true_type, false_type> 

この例では明らかにコンパイルされませんが、うまくいけば私は何をしようとしているのかを確認します。

今私は、namespace detailsでテストし、次にconditional_tで使用するそれぞれのメソッドの構造体を設定する必要があります。これはSFINAEの内部動作を、それが使用されているから分離します。

C++ 14/17はこれを行う代替方法を提供していますか、宣言して使用する方法はありますか匿名のconditional_tの状態のstruct

簡単なテストhereを作成しました。これを試してみてください。

+2

テンプレートの引数に外部リンケージが必要なので、すぐに匿名の構造体をそこで使用することはできません。 「他の方法」が存在するかどうかはわかりません。 – SergeyA

+0

@SergeyAええ、私は考えることができるすべての回避策を試しました:ラムダを呼び出すことはできません、ローカルにテンプレートの専門化を行うことはできません、私は最後の手段として私の次のストップ原因は ' details' –

+0

@SergeyA C++ 11はルールを緩和し、外部リンケージはもはや必要ありません。しかしあなたの主なポイントはまだ立っていますが、この質問に対する明白な答えを妨げる制限がまだあります。 – hvd

答えて

0

[temp.param]ドラフト標準N458214.1/P2テンプレートパラメータによれば、(強調鉱山)

ストレージクラスは、テンプレートパラメータ 宣言で指定してはなりません。 型は、テンプレートパラメータ 宣言で定義されていてはなりません。

その結果、あなたのような何かを持つことはできません。

conditional_t<bool, struct Foo {...}> 

を彼らは無名のクラス(例えばであっても多くの場合率直に言って、私は、C++でのこのような構築を可能とする十分な理由を見つけることができません。 、マングリング問題を考える)。

関連する問題