Do wykrywania członków w C++ 14 Użyłem kodu opartego na przykładzie here, ale to nie wydaje się działać.Detekcja członka za pomocą void_t
Kompletny przykład:
#include <string>
template <typename...>
using void_t = void;
template <typename, typename = void> class HasMember_substr : public std::false_type {};
template <typename T> class HasMember_substr<T, void_t<typename T::substr>> : public std::true_type {};
template <typename, typename = void> class HasMember_fff : public std::false_type {};
template <typename T> class HasMember_fff<T, void_t<typename T::fff>> : public std::true_type {};
static_assert(HasMember_substr<std::string>::value, "");
static_assert(!HasMember_fff<std::string>::value, "");
int main() { return 0; }
Zestawione użyciu clang++ --std=c++14 test.cpp
na OS X, wersja kompilatora (clang++ --version
): Apple LLVM version 7.0.2 (clang-700.1.81)
Drugi assert powiedzie, ale pierwsza zawiedzie. Czemu? Próbowałem również używać decltype(T::substr)
zamiast typename T::subset
, z tym samym wynikiem.
'T :: substr' to nie to samo co' T {}. Substr' –
Czy 'substr' jest przeciążoną funkcją w twojej implementacji? (Mogło tak być). – aschepler
Skopiowałeś przykład testowania dla typu i spodziewałeś się, że ten sam kod zadziała w testowaniu dla funkcji składowej. To oczywiście nie zadziała. 'std :: string :: substr' nie jest typem, więc' typename T :: substr' jest oczywiście nonsensem. Powinieneś skopiować przykład, który testuje pre-inkrementację. –