は、次のコードを考えてみましょう:バリデーションリストと単一のテンプレートパラメータ:標準は何を表していますか?
#include <iostream>
#include <type_traits>
// Variadic version
template<class... Variadic>
void f(const Variadic&... variadic)
{
std::cout<<"variadic"<<std::endl;
}
// Single version
template<class Single, class = typename std::enable_if<std::is_fundamental<Single>::value>::type>
void f(const Single& single)
{
std::cout<<"single"<<std::endl;
}
// Main
int main()
{
f(); // variadic
f(42); // single : why?
f(std::string()); // variadic
f(42, 42); // variadic
return 0;
}
の行は、「単一の」(G ++ 4.6.3の下で)うまくコンパイルし、オーバーロードの解決の問題が発生しないマークされ、なぜ私は理解していません。 C++ 11標準では、固定数のパラメータを持つテンプレート関数は、同じシグネチャを持つ可能性のある可変関数よりも優先されていますか?
注: 'enable_if'は「シングル」過負荷がより専門的なこととは何の関係もありません、それは直交だと可能な過負荷のセットから*除去機能*であります。 –
しかし、関数を削除しないと 'f(const int&)'よりも特殊な 'f (const int&)'が得られます。2番目のテンプレートパラメータが 'enable_if'であるという事実は関係ありません。実際には2番目のパラメータがあることが関係しており、過負荷が選択される理由です。 'enable_if'型を' void'に置き換えると、 'f(std :: string())'のためにそのオーバーロードが実行可能になります。 @MatthieuM。 –
。私はそれが 'enable_if'を使用する意図であることに同意します。 Jonathanが説明しているように、テンプレートの副作用は、削除されていないケースに対してテンプレートをより特殊化することです。 –