2017-03-21 3 views
0

ich ziemlich neu bin zu C++ und ich versuche mein Bestes, um so etwas zu konstruieren:C++: Konstrukt Straße mit zwei gleichen typenames aus Vorlage

enum class Unit { km, m, cm }; 


template<int v, Unit u> 
struct Measure { 
    static const int value = v; 
    static const Unit unit = u; 
}; 


template<typename Measure, typename Measure> 
struct Measures_same { 
    static const bool value(const Measure m1, const Measure m2) { 
     return m1.unit == m2.unit; 
    } 
}; 

Mein Ziel hier ist, dass ich meine Eigenschaft aufrufen wie folgt:

Measures_same<Measure<1, Unit::km>,Measure<1, Unit::cm>>::value 

, die false zurückgeben würde. Offensichtlich darf ich nicht den gleichen Typnamen in der Vorlage zweimal (Vorlage) definieren, aber ich bin mir nicht sicher, wie ich es sonst tun sollte. Wenn ich einen davon entferne, stimmt die Anzahl der Argumente nicht mehr überein.

Wie soll ich fortfahren?

Vielen Dank im Voraus!

+2

Just do 'template ' und verwenden 'M1' und' M2'? Sie können dies auch tun, ohne eine statische Funktion zu verwenden, indem Sie "constexpr" verwenden. Außerdem macht es keinen Sinn, ein 'const bool' zurückzugeben, man könnte auch' bool' zurückgeben. – cdhowie

+0

Wie dumm von mir, vielen Dank! – user1390504

+0

Es sieht so aus, als würden Sie eine Mischung aus objektorientierter Programmierung und Template-Metaprogrammierung machen. Wahrscheinlich sollte "Measure" keine Vorlage sein, da Sie wahrscheinlich Werte zur Laufzeit ändern wollen. Vielleicht könnte es eine Vorlage basierend auf der Dimension der Einheit (Länge, Masse, Ladung, etc.) sein. Wenn Sie Ihre Frage bearbeiten, um ein vollständiges Programm (ein [mcve]) zu erstellen, damit wir sehen können, wie Sie ein 'Measures_same'-Objekt verwenden möchten, wird klarer, was geändert werden muss, um Ihre Anforderungen zu erfüllen. –

Antwort

1
  1. Measure_same muss zwei verschiedene Vorlagenparameter verwenden. Wenn die Typen identisch sind, ist der Rückgabewert value immer true. Verwendung:

    template<typename Measure1, typename Measure2> 
    struct Measures_same { ... }; 
    
  2. Sie brauchen keine Eingaben Measure_same::value. Verwenden Sie einfach:

    template<typename Measure1, typename Measure2> 
    struct Measures_same { 
        static const bool value() { 
         return Measure1::unit == Measure2::unit; 
        } 
    }; 
    
  3. einen Funktionsaufruf Mit dem value von Measure_same zu bekommen. Verwendung:

    Measures_same<Measure<1, Unit::km>,Measure<1, Unit::cm>>::value() 
    

    Zum Beispiel:

    std::cout << std::boolalpha << Measures_same<Measure<1, Unit::km>,Measure<1, Unit::cm>>::value() << std::endl; 
    
+1

'Wert' kann ein Wert sein:' static const bool Wert = Measure1 :: unit == Measure2 :: unit; '. –

+0

@TobySpeight, das ist auch eine Option.Ich blieb bei der Idee des OP, dass es eine Funktion ist. –

1

Sie Template-Spezialisierung und etwas Hilfe von type_traits

Basisvorlage (immer false) verwenden können:

template<class...> 
struct Measures_same : std::false_type{}; 

Spezialisierung für zwei Measures Klassen mit dem gleichen Unit Argument:

template<int v, Unit u, int w> 
struct Measures_same<Measure<v, u>, Measure<w, u>> : std::true_type{}; 

Verwenden Sie es wie folgt:

static_assert(Measures_same<Measure<1, Unit::km>, Measure<2, Unit::km>>::value, "Fail"); 
static_assert(!Measures_same<Measure<1, Unit::m>, Measure<1, Unit::km>>::value, "Fail2"); 

Demo

Verwandte Themen