可能性の重複:たとえば
C++ templates that accept only certain types一部のデータ型に対してのみテンプレート関数を定義できますか?
、我々は、整数、浮動小数点数、倍精度ではなく、文字列を使用することができますテンプレート関数を定義したい場合。そうする簡単な方法はありますか?
可能性の重複:たとえば
C++ templates that accept only certain types一部のデータ型に対してのみテンプレート関数を定義できますか?
、我々は、整数、浮動小数点数、倍精度ではなく、文字列を使用することができますテンプレート関数を定義したい場合。そうする簡単な方法はありますか?
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から簡単に実装または取得できます。
通常、テンプレートの実装には暗黙的な制限があるため、通常は明示的な制限を加える必要はありません。ただし、特定のタイプを無効または有効にすると便利なことがあります。
値の種類を確認できます。それらがあなたの指定したタイプの1つであれば、それを続けることができます。そうでなければ、その関数を返すことができます。 詳細については、こちらを参照してください。http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Fthe_typeid_operator.htm
typeidを使用すると、コンパイルエラーも発生する可能性があります。
通常、特定のタイプをホワイトリストに登録すると、テンプレートの使用が非常に制限されます。
ブーストは、基本的にテンプレート用のインターフェイスであるconceptsと呼ばれています。 特定のタイプをホワイトリストにする代わりに、特定の条件(関数がないか、間違った引数など)が満たされない場合、コンパイル時エラーを作成できます。もちろん、これを使ってテンプレート引数を特定の型に限定することもできます。
私が知っている限りでは、C++やC++ 11ではなく、コンセプトに関する古い削除された機能が、私がうまく覚えていれば、あなたが望むことをします。 – Geoffroy
@Geoffroy:コア言語レベルのサポートはありませんが、enable_ifを使用すると実行できます(私の答えを参照)。ちょっと面倒かもしれませんが、私はvariadicテンプレートを使ってC++ 2011でこのより良い構文を与えることができるいくつかのヘルパータイプを想像することができます(私はこれをまだ実験していません)。 –
サポートされているタイプに同じ定義を適用したいのですか、それともそれぞれを別に定義する必要がありますか?すなわち、 'f'は 'f 'と全く同じ本体を持っていますか? –