2016-06-12 21 views
1

私はtemplatクラスAを構築し、特別な言葉を経由してそのデフォルトコンストラクタを呼び出すようにしようとしているを作成する方法「をNONE は、私が持って考えてみます。は特別な言葉

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

と私のことができるようにしたいです書き込み

A<int> x = None; 

呼ぶいる();

私は多分私はtypedefでのいくつかの並べ替えを使用することができます考えていたが、私はどのように

を知りません10

答えて

3

ダミーの型とその型を取るコンストラクタを提供することができます。また、インスタンスを構築するデフォルトと同等の処理を行います。そうでない場合、テンプレートはあまり意味がありませんので、例えば、

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; 
} 

注私は、intからTにまで_valを変更しました。

+0

.......... –

+0

ありがとう。私はintではなく、編集することを意味しました。 –

2

普通の方法は、タグクラス(この場合はnone_type)を作成し、利用可能なconstexpr(または静的const)モデルを作成することです。

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

良い解決策:-) – juanchopanza

+0

ありがとう、私はそれを使用したいと思いますが、私はC++ 98に制限されています。とにかくこれらの新しいものについて知っておくと良い –

+0

代わりに静的なconstを 'none'にします。このシナリオでは、同じ効果があります。 –