タイプのコンストラクタテンプレートを制限したいと思います。もしそうなら、あなたはこれを行うことができます。
#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>::value
がtrue
あるのみ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>::value
がtrue
あるのみT
れる受け入れることができます。 exists
メタ機能は、T
がタイプリストsupported_types
に存在するかどうかをチェックします。このタイプリストにタイプを追加できます。
そしてtypelist
の実装、およびexists
は(私の解決策を参照してください)ここにある:
それはあなたが私たちが正確に何知っているようにいくつかのコードの形で例を与える方が良いです達成したい。 – iammilind
質問は自信を持って答えることができないほど明確ではありません。 – Nawaz