2016-06-09 5 views
0

ich folgende Template-Klasse hat:Mit Template-Klasse mit dem unvollständigen Typ void

template <typename T> 
class myClass 
{ 
public: 
    // Many methods... 
protected: 
private: 
    T attribute 
    // Other attributes. 
}; 

ein Objekt vom Typ myClass<void> Instanziierungsanwendung nicht funktioniert, weil der void attribute. Können Sie mir einige Hinweise geben, um Objekte des Typs myClass<void> zu verwenden, ohne die gesamte Klasse zu spezialisieren. Da es viele Elementfunktionen hat, die auf den Typ T angewiesen sind, führt eine Spezialisierung zu einer Codeverdopplung.

+3

Was wollen Sie Ihre ' Attribut-Typ zu sein? –

+0

Ich verstehe nicht wirklich, was der Sinn dieses ist. Basierend auf dem, was Sie gezeigt haben, wird nur der Schablonentyp verwendet, der das Problem verursacht. –

+0

Ich möchte in der Lage sein, ein Objekt vom Typ 'myClass ' instanziieren, aber in diesem Fall würde' Attribut' vom Typ 'void' sein, was nicht möglich ist. – baboulinet

Antwort

2

Sie können das ganze Problem aufschieben durch einen benutzerdefinierten Typen und spezialisiert, dass die Verwendung:

template<typename T> 
struct my_type_t 
{ 
    using type = T; 
}; 

template<> 
struct my_type_t<void> 
{}; 

template<typename T> 
using my_type = typename my_type_t<T>::type; 

template <typename T> 
class myClass 
{ 
public: 
    // Many methods... 
protected: 
private: 
    my_type<T> attribute 
    // Other attributes. 
}; 

dann mindestens Sie müssen nicht wieder den ganzen Rest der Klasse duplizieren.

Aber es macht wahrscheinlich nicht so viel Sinn, wie Sie sicherlich den Typ irgendwo verwenden möchten. Sie müssten diese Orte also weiter spezialisieren.

3

Erstellen einer Vorlage gebildeten Basisklasse enthält Attribut, spezialisieren sie für void und erben von ihm:

namespace detail //Warn end user that he should not use stuff from here 
{ 
    template <typename T> 
    struct myClass_base 
    { 
     T attribute; 
    }; 

    template <> 
    struct myClass_base<void> 
    {}; //No attribute at all 
} 

template <typename T> 
class myClass: private detail::myClass_base<T> 
{ 
    //rest of definition 
}; 

Dies würde myClass fehlt machen attribute Feld, wenn es mit Typ-Instantiierung void

Verwandte Themen