2011-12-29 4 views
5

可能性の重複:たとえば
C++ templates that accept only certain types一部のデータ型に対してのみテンプレート関数を定義できますか?

、我々は、整数、浮動小数点数、倍精度ではなく、文字列を使用することができますテンプレート関数を定義したい場合。そうする簡単な方法はありますか?

+0

私が知っている限りでは、C++やC++ 11ではなく、コンセプトに関する古い削除された機能が、私がうまく覚えていれば、あなたが望むことをします。 – Geoffroy

+0

@Geoffroy:コア言語レベルのサポートはありませんが、enable_ifを使用すると実行できます(私の答えを参照)。ちょっと面倒かもしれませんが、私はvariadicテンプレートを使ってC++ 2011でこのより良い構文を与えることができるいくつかのヘルパータイプを想像することができます(私はこれをまだ実験していません)。 –

+0

サポートされているタイプに同じ定義を適用したいのですか、それともそれぞれを別に定義する必要がありますか?すなわち、 'f 'は 'f 'と全く同じ本体を持っていますか? –

答えて

8

std::enable_ifをいくつかの形または形式で使用する方法。サポートされている型のセレクタが戻り型として使用されます。たとえば:

template <typename T> struct is_supported { enum { value = false }; }; 
    template <> struct is_supported<int> { enum { value = true }; }; 
    template <> struct is_supported<float> { enum { value = true }; }; 
    template <> struct is_supported<double> { enum { value = true }; }; 

    template <typename T> 
    typename std::enable_if<is_supported<T>::value, T>::type 
    restricted_template(T const& value) { 
    return value; 
    } 

はもちろん、あなたがis_supportedより特色をより良い名前を与えたいです。 std::enable_ifはC++ 2011の一部ですが、使用している標準ライブラリでは利用できない場合は、boostから簡単に実装または取得できます。

通常、テンプレートの実装には暗黙的な制限があるため、通常は明示的な制限を加える必要はありません。ただし、特定のタイプを無効または有効にすると便利なことがあります。

0

値の種類を確認できます。それらがあなたの指定したタイプの1つであれば、それを続けることができます。そうでなければ、その関数を返すことができます。 詳細については、こちらを参照してください。http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Fthe_typeid_operator.htm

typeidを使用すると、コンパイルエラーも発生する可能性があります。

0

通常、特定のタイプをホワイトリストに登録すると、テンプレートの使用が非常に制限されます。

ブーストは、基本的にテンプレート用のインターフェイスであるconceptsと呼ばれています。 特定のタイプをホワイトリストにする代わりに、特定の条件(関数がないか、間違った引数など)が満たされない場合、コンパイル時エラーを作成できます。もちろん、これを使ってテンプレート引数を特定の型に限定することもできます。

関連する問題