通常の関数のオーバーロードがこの例の方が効果的であるという事実を簡単に却下します。これは、テンプレートプログラミングについて学ぶ方法としてのみ意味されています。関数のオーバーロードを使用することで得られる利点/相違点については、関数テンプレートの特殊化と比較してコメントすることは大歓迎です(しかし、それは独自の質問に値するかもしれません)。テンプレートの特殊化のために複数の型を一致させる
template <typename T>
inline void ToString(T value, char* target, size_t max_size);
template <>
inline void ToString<float>(float value, char* target, size_t max_size)
{
snprintf(target , max_size , "%f" , value);
}
template <>
inline void ToString<double>(double value, char* target, size_t max_size)
{
snprintf(target , max_size , "%f" , value);
}
のみ両方float
とdouble
型と一致これらの専門分野のいずれかを記述する方法があります:
は、次の例を考えてみましょうか?
基本的には、float
とdouble
(「浮動小数点型」または「倍精度型」)の両方に一致するテンプレートタイプのテンプレート特殊化を作成することを想定していますが、C++で可能かどうかはわかりません。それは、私が予期せぬテンプレートマジックが私の目の前で起こっているのを見たので、ここで質問するのは良い質問だと思います。
複数の具体的なタイプに一致するものが必要な場合は、部分的な特殊化ですが、これは機能には使用できません。 –
こんにちは@Kerrek、私の部分的な専門化の理解は、テンプレートパラメータのサブセットを特化することです。ここには1つのテンプレートパラメータしかありません。私は部分的な専門化がここでどのように関連しているかに従いません – lurscher
部分的な専門化は、結果がまだタイプではなくテンプレートであることを意味します。たとえば、 'template struct X;テンプレート構造体X ; 'それは部分的です。 –