以内に私はクラスがメンバ関数を持っているなら、私に判断するために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を作成しました。これを試してみてください。
テンプレートの引数に外部リンケージが必要なので、すぐに匿名の構造体をそこで使用することはできません。 「他の方法」が存在するかどうかはわかりません。 – SergeyA
@SergeyAええ、私は考えることができるすべての回避策を試しました:ラムダを呼び出すことはできません、ローカルにテンプレートの専門化を行うことはできません、私は最後の手段として私の次のストップ原因は ' details' –
@SergeyA C++ 11はルールを緩和し、外部リンケージはもはや必要ありません。しかしあなたの主なポイントはまだ立っていますが、この質問に対する明白な答えを妨げる制限がまだあります。 – hvd