これら 2 つの専門分野は本質的に同じことを行っているのでしょうか?
//generic:
template<class T>
struct A{
...
}
template<class T>
struct A<int>{
...
}
template<>
struct A<int>{
...
}
つまり、部分的な特殊化は完全な特殊化として書き直すことができるように思えます。
いいえそうではありません。チューリング タール ピットでは、十分に強力なプログラミング手法はすべて、他のすべての手法と同等です。
template<typename A, typename B>
struct foo:std::false_type {};
template<typename T>
struct foo<T,T>:std::true_type {};
ここでは、部分的な特殊化によって 2 つの引数が 1 つにマップされます。次のようなより高度なもの:
template<typename T>
struct foo<T,std::vector<T>>:std::integral_constant<int, 7> {};
も可能です。
単一の引数でこれを行うこともできますtemplate
:
template<typename T>
struct is_func_signature : std::false_type {};
template<typename R, typename... Args>
struct is_func_signature< R(Args...) >: std::true_type {};
ここで、多くの型引数に対して 1 つの引数をパターン マッチし、それらを抽出します。
部分的な特殊化は、最初のインターフェイスに有効な引数のパターン マッチングのゲームです。