以下のコードは、タイプT
にメソッドsort
があるかどうかを正しくチェックしています。しかし、(*)
と表示された行をdecltype(&U::sort,...)
に変更してdecltype(U::sort,...)
(記号&
は削除されています)の場合、コードは常にfalse
を返します。関数の前にアンパサンド付きのSFINAE関数
なぜですか?
なぜ名前自体では十分ではありませんか?これは&
の意味ですか?
#include <iostream>
#include <type_traits>
template <typename T>
class has_sort {
template <typename U>
static auto check(bool) -> decltype(&U::sort, std::true_type()); // (*)
template <typename U>
static std::false_type check(...);
public:
using type = decltype(check<T>(true));
static bool const value = type::value;
};
int main() {
struct Foo { void sort(); };
struct Foo2 { void sort2(); };
std::cout << "Foo: " << has_sort<Foo>::value << std::endl;
std::cout << "Foo2: " << has_sort<Foo2>::value << std::endl;
std::cout << "int: " << has_sort<int>::value << std::endl;
}
私は2つの回答を受け入れることはできません。ちなみに、アンパサンドのないバージョンは、データメンバ(静的かどうか)だけでなく、静的メソッドにもマッチします。 – olpa
clangもそれを受け入れ、正しいと思います。標準では、「静的メンバー関数(9.4)は通常の関数です。」 – olpa
確かに、静的関数のアンパサンドなしのチェックが正しいかもしれませんが、静的でないメンバー関数には必要です。 –