2011-06-18 14 views
0

以下のようにしてthisという質問がありますが、クラスのコンストラクタで使用できるようにコードをどのように変更できますか?私は新しいクラスを書いていますが、入力はある種の番号である必要がありますが、それ以外は何もありません。ただし、コードは関数の前に型を宣言するようなものです。コンストラクタは正確なタイプを持っていけないから、私は必要それが機能自体の型を宣言しないようにコンストラクタで特定の型を受け入れる

私の新しいクラス:

class C{ 
    public: 
     C(); 
     C(T value);// specifically looking for this 


     T f(T value); // what the code currently does 

}; 

コードのリンクでは、[受け入れ、]は整数を返すという関数を作成しますタイプTと入力します。何も返さないのでコンストラクタで使用できるようにする必要があります

+1

それはあなたが私たちが正確に何知っているようにいくつかのコードの形で例を与える方が良いです達成したい。 – iammilind

+3

質問は自信を持って答えることができないほど明確ではありません。 – Nawaz

答えて

3

タイプのコンストラクタテンプレートを制限したいと思います。もしそうなら、あなたはこれを行うことができます。

#include <type_traits> 
//#include <tr1/type_traits> // for C++03, use std::tr1:: 

class C 
{ 
    public: 

    template<typename T> 
    C(T value, typename enable_if<std::is_arithmetic<T>::value,T>::type *p=0) 
    { 

    } 
}; 

このコンストラクタテンプレートはis_arithmetic<T>::valuetrueあるのみTれる受け入れることができます。 enable_ifの実装は、the other answerのようにまったく同じです。

また

、またはあなたがtype_traitsを持っていない場合、あなたはenable_ifと一緒にtypelistを使用することができます。サポートされているタイプリストを具体的に定義できるので、これはより良い解決策だと思います。

typedef typelist<int> t1; 
typedef typelist<short, t1> t2; 
typedef typelist<char, t2> t3; 
typedef typelist<unsigned char, t3> t4; 
//and so on 

typedef t4 supported_types;//supported_types: int, short, char, unsigned char 

class C 
{ 
    public: 

    template<typename T> 
    C(T value, typename enable_if<exits<T,supported_types>::value,T>::type *p=0) 
    { 

    } 
}; 

このコンストラクタテンプレートは、exists<T,supported_types>::valuetrueあるのみTれる受け入れることができます。 existsメタ機能は、Tがタイプリストsupported_typesに存在するかどうかをチェックします。このタイプリストにタイプを追加できます。

そしてtypelistの実装、およびexistsは(私の解決策を参照してください)ここにある:

関連する問題