Per il rilevamento dei membri in C++ 14 ho utilizzato il codice basato sull'esempio here, ma sembra che non funzioni.Rilevamento dei membri utilizzando void_t
Un esempio completo:
#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; }
compilato utilizzando clang++ --std=c++14 test.cpp
su OS X, versione del compilatore (clang++ --version
): Apple LLVM version 7.0.2 (clang-700.1.81)
La seconda asserzione riesce, ma la prima non riesce. Perché? Ho anche provato a utilizzare decltype(T::substr)
anziché typename T::subset
, con lo stesso risultato.
'T :: substr' non è lo stesso di' T {}. Substr' –
'substr' è una funzione sovraccaricata nella vostra implementazione? (È consentito che sia.) – aschepler
Hai copiato un esempio di test per un tipo e si aspetta che lo stesso codice funzioni per testare una funzione membro. Ovviamente non funzionerà. 'std :: string :: substr' non è un tipo, quindi' typename T :: substr' è ovviamente senza senso. Dovresti aver copiato l'esempio che prova per il pre-incremento. –