Aşağıdaki kod, T
türünün sort
yöntemine sahip olup olmadığını doğru olarak denetler. Ancak, 'u decltype(U::sort,...)
(&
sembolü kaldırılır) değiştirerek (*)
işaretli satırı değiştirdiğimde, kod her zaman false
döner.SFINAE işlevi ile bir işlev isminden önce ve aşağıdaki isimle
Neden?
Neden adın kendisi yeterli değil? Bu &
ne anlama geliyor?
#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;
}
Yazık İki cevap kabul edemiyorum. Bu arada, ampersand-free sürümü sadece bir veri üyesi (statik değil) değil aynı zamanda statik bir yöntemle de eşleşiyor. – olpa
clang da bunu kabul ediyor ve bence doğru. Standart diyor ki: "Bir statik üye işlevi (9.4) sıradan bir işlevdir." – olpa
Gerçekten de, denetim, statik işlev için ampersan olmadan doğru olabilir, ancak statik olmayan üye işlevleri için gereklidir. –