Wählen Sie den Klassenkonstruktor mit enable_if aus

Betrachten Sie folgenden code:

#include <iostream>
#include <type_traits>

template <typename T>
struct A {
    int val = 0;

    template <class = typename std::enable_if<T::value>::type>
    A(int n) : val(n) {};
    A(...) { }

    /* ... */
};

struct YES { constexpr static bool value = true; };
struct NO { constexpr static bool value = false; };

int main() {
    A<YES> y(10);
    A<NO> n;
    std::cout << "YES: " << y.val << std::endl
              << "NO:  " << n.val << std::endl;
}

Möchte ich selektiv definieren-Konstruktor A::A(int) nur für einige Arten mit enable_if. Für alle anderen Typen gibt es Standard-Konstruktor A::A (...), das sollte standardmäßig der Fall für compiler bei substitution scheitert. Aber das macht Sinn für mich-compiler (gcc version 4.9.0 20130714) ist immer noch beschweren

sfinae.cpp: In Instanziierung von 'struct': sfinae.cpp:19:11:
erforderlich von hier aus sfinae.cpp:9:5: Fehler: kein Typ mit dem Namen 'Typ' in
'struct std::enable_if'
A(int n) : val(n) {};

Ist so etwas möglich für den Konstruktor? Ist das möglich mit einem anderen Konstruktor(en) (copy-Konstruktor und move-Konstruktor)?

InformationsquelleAutor der Frage tomas789 | 2013-07-24

Schreibe einen Kommentar