以下の例は、#1が呼ばれる。
template < typename T > void f(T, T) { std::cout << "#1" << std::endl ; } template < typename T, typename ... Types > void f( T, Types ... ) { std::cout << "#2" << std::endl ; } int main() { f(0, 0) ;// #1 }
なぜならば、Non-Variadic Templateは、Variadic Templateより、もっと特殊化(more specialized)されるからだ。
では、以下の例はどうだろうか。
template < typename T > void f(T) { std::cout << "#1" << std::endl ; } template < typename T, typename ... Types > void f( T, Types ... ) { std::cout << "#2" << std::endl ; } int main() { f(0) ;// which? }
gcc4.5は、#1を呼ぶ。つまり、Non-Variadic Templateの方が、more specializedであると考えているようだ。しかし、この場合、Template Parameter Packは、ゼロ個の型を引数にとる。Template Parameter Packがゼロ個の型を引数にとることは、規格で規定されている。
とすれば、Partial Orderingに、Variadic Templateは、全く関わっていないのではないか。なぜならば、Template Parameter Packは、何も引数をとっていないのだ。関数のシグネチャは、どちらも、int ( int )である。
Partial Orderingの定義を読んだが、どうも今の文面は、何らかの引数(type, non-type, template template parameter(Template Parameter Packを含む) )を引数にとることを想定している。
これは、規格の問題なのかもしれない。
No comments:
Post a Comment
You can use some HTML elements, such as <b>, <i>, <a>, also, some characters need to be entity referenced such as <, > and & Your comment may need to be confirmed by blog author. Your comment will be published under GFDL 1.3 or later license with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.