2016-06-12 9 views
1

Ich versuche, eine templat-Klasse A zu bauen und seine Standardkonstruktors über ein spezielles Wort „NONE nennen halte ich haben:Wie spezielle Wörter erstellen

template<class T> 
class A { 
public: 
    A():_val(0); 
    A(T val):_val(val); 
private: 
    int _val; 
} 

und ich möchte in der Lage sein schreiben

A<int> x = None; 

die A nennen();

ich dachte, vielleicht kann ich irgendeine Art von typedef verwenden, aber ich weiß nicht, wie

Antwort

3

Sie könnten einen Dummy-Typ und einen Konstruktor angeben, der diesen Typ verwendet und dem Standard entspricht, der beim Erstellen einer Instanz verwendet wird. Zum Beispiel

struct None_t {}; 

constexpr None_t None{}; // const None_t None = {}; in C++03 

template<class T> 
class A { 
public: 
    A() : _val() {}; 
    A(None_t) : A() {} // A(None_t) : _val() {} in C++03 
    A(T val) : _val(val) {} 
private: 
    T _val; 
}; 

int main() 
{ 
    A<int> x = None; 
} 

Hinweis änderte ich _val zu von int zu T, da sonst nicht die Vorlage nicht viel Sinn machen.

+0

dito :) ...... –

+0

Danke. Ich meinte T nicht int, wird bearbeiten. –

2

Der übliche Weg wäre, eine Tag-Klasse zu erstellen, in diesem Fall none_type und ein conexpr (oder statisches const) Modell davon verfügbar zu haben.

struct none_type {}; 
constexpr auto none = none_type {}; 

template<class T> 
class A { 
public: 

    A():_val(0) {}; 

    A(none_type) : A() {}; 

    A(int val):_val(val) {}; 
private: 
    int _val; 
}; 

int main() 
{ 
    A<int> a = none; 
} 
+0

Schöne Lösung :-) – juanchopanza

+0

Danke, ich würde es verwenden, aber ich bin auf C++ 98 beschränkt. Gut zu wissen über diese neuen Dinge sowieso –

+0

Dann make 'none' statische const stattdessen. In diesem Szenario hat es den gleichen Effekt. –