今更気がついたのですが、C++の関数テンプレートを明示的特殊化した関数と、同じ名前の非テンプレートとしてオーバーロードした関数って、ほとんど同じものと思います。
微細な差はありますが、大差ないのでどちらか一方でも十分な気がしています。
C++
1#include <iostream> 2 3// プライマリー・テンプレート 4template<typename T> 5void f(T) 6{ 7 std::cout << "f<T>(T)\n"; 8} 9 10// 明示的特殊化 11template<> 12void f<int>(int) 13{ 14 std::cout << "F<int>(int)\n"; 15} 16 17// オーバーロード 18void f(int) 19{ 20 std::cout << "f(int)\n"; 21} 22 23int main() 24{ 25 f(1.1); // f<T>(T) 26 f(1); // f(int) 27}
Bjarne Stroustrup著「C++の設計と進化」の476ページによると
そこで私は、テンプレートを”特殊化”する仕組みが必要だと結論した。それは、テンプレートが一般的なオーバロードの仕組みを受け入れることによって、または、もっと特定の仕組みによって実現するだろう。私は特定の仕組みの方を選んだ。主な問題はCの不規則性だと思っていたのと、オーバロードを提案すると常に抗議の声の大合唱がわき起こるからだ。
この本は、この後「特定の仕組み」として「明示的特殊化」と思われる方法を解説しています。(C++当初の文法なので現在とはちょっと違う書き方になってますが、意味は「明示的特殊化」と思います。)
しかし、現在はオーバロードと明示的特殊化の両方がサポートされています。
もしかして、何か大きな使い勝手の差が両者にはあるのでしょうか?
そうではなく、C++の当初は明示的特殊化だけだったのが、やっぱりオーバ-ロードの方が便利ということでオーバーロードが導入され、互換性維持のため明示的特殊化が残されたということでしょうか?
はたまた他の理由でしょうか?
もし、ご存じの方がいらっしゃいましたら、是非教えて頂けると嬉しいです。
また、ご存知無い方も「私はこう推測する」等のご意見を貰えると有り難いです。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/10/24 06:42 編集