EDIT: this andere Frage von mir konzentriert sich auf eine reduzierte Version dieses Problems, möglicherweise einfacher zu verstehen.detection idiom: Warum muss die Bedingung eine `using` Richtlinie sein?
Ich schrieb ein kleines Snippet, das das Verhalten von std::experimental::is_detected
(here) reproduziert. Meine Implementierung wurde im Wesentlichen von cppreference übernommen, aber ich habe den Template-Parameter Default
losgeworden.
Meine Frage ist: im folgenden Ausschnitt, warum has_type
(die Bedingung geprüft werden) eine using
Erklärung zu sein und kann nicht sein, z.B. eine Struktur (in diesem Fall gibt is_detected
ein falsches Ergebnis zurück)?
/***** is_detected definition *****/
template<typename...Args>
using void_t = void;
template<typename Void, template<class...> class Op, typename ...Args>
struct Detector {
static constexpr bool value = false;
};
template<template<class ...> class Op, typename ...Args>
struct Detector<void_t<Op<Args...>>, Op, Args...> {
static constexpr bool value = true;
};
template<template<class...> class Op, typename...Args>
using is_detected_t = Detector<void, Op, Args...>;
/****************************/
/***** is_detected test *****/
// two dummy types on which to test a condition
struct Yes { using type = void; };
struct No { };
// the condition to test
template<typename T>
using has_type = typename T::type;
// struct has_type { using type = typename T::type; }; // does not work as intended!
int main() {
static_assert(is_detected_t<has_type, Yes>::value, "");
static_assert(!is_detected_t<has_type, No>::value, "");
return 0;
}
Wenn Sie eine Struktur wollten, müssten Sie 'has_type :: type' anstelle von' has_type' verwenden, damit es funktioniert. – SingerOfTheFall
nicht sicher Ich verstehe ... 'is_detected_t :: value' wäre kein gültiger Ausdruck –
blue