Chcę sprawdzić, czy istnieje funkcja nie-element członkowska akceptująca typ parametru T. W tym celu użyłem "sztuczki" void_t
przedstawionej przez pana Waltera E. Browna w cppcon (ta sama sztuczka działa bez żadnych problemów, aby sprawdzić, czy istnieje typ członka lub funkcja członka).Sprawdzanie, czy istnieje funkcja nie-składowa akceptująca T param
#include <iostream>
#include <type_traits>
template<typename...>
using void_t = void;
void Serialize(float&)
{
}
template<typename T, typename = void>
struct has_external_serialize : std::false_type
{
};
template<typename T>
struct has_external_serialize<T, void_t<decltype(Serialize(std::declval<T&>()))>> : std::true_type
{
};
void Serialize(int&)
{
}
int main(int argc, const char * argv[])
{
std::cout<<has_external_serialize<float>::value<<has_external_serialize<int>::value;
}
Kod ten drukuje 11
gdy tworzone przy użyciu gcc 10
kiedy zestawiane z brzękiem xcode (5.1.1).
Moje pytania to - czy ten kod jest prawidłowy? Jeśli tak, czy jest jakiś błąd w klangu lub błąd w GCC, czy kod znajduje się w jakimś "zdefiniowanym przez implementację" obszarze i nie mogę założyć, że będzie to samo zachowanie na wszystkich platformach?
Typy zależne od pendrive oraz typy "std" przed specjalizacją. Inne typy używają ADL. Wtedy klang będzie szczęśliwy.Wierzę, że to, co zrobiłeś, jest źle sformułowane, ale nie masz czasu, aby to udowodnić. – Yakk
Wygląda bardziej jak błąd w GCC (przynajmniej 4.9.0), ponieważ wypisuje '11' nawet dla' struct has_external_serialize())) >>: std :: true_type' –
@Felics: Witamy w CppCon! :-) –