Вопрос в том, почему, если я специализируюсь на многоточии, которое подразумевает любое число, я получаю ошибку, но когда я специализируюсь на отсутствии аргументов, она компилируется?
Потому что многоточие не подразумевает никаких скобок (так как вы пытаетесь использовать его в main
). многоточие используется для обозначения переменного числа аргументов в функции (C ++ 03).
РЕДАКТИРОВАТЬ: Возможно, следующий пример дает вам достаточно подсказок для реализации того, что вы хотите:
template<class T>
struct TypeX
{
TypeX() { cout << "TypeX" << endl; }
};
template<typename T>
struct TypeX<T(*)()> //will match with : int (*)(), char (*)(), etc!
{
TypeX() { cout << "TypeX<T(*)()>" << endl; }
};
template<typename T, typename S>
struct TypeX<T(*)(S)> //will match with : int (*)(int), char (*)(int), etc!
{
TypeX() { cout << "TypeX<T(*)(S)>" << endl; }
};
template<typename T, typename S, typename U>
struct TypeX<T(*)(S, U)> //will match with : int (*)(int, char), char (*)(int, int), etc!
{
TypeX() { cout << "TypeX<T(*)(S, U)>" << endl; }
};
int main() {
TypeX<int*>();
TypeX<int(*)()>();
TypeX<int(*)(int)>();
TypeX<int(*)(char)>();
TypeX<int(*)(char, int)>();
TypeX<int(*)(short, char)>();
return 0;
}
Вывод:
TypeX
TypeX<T(*)()>
TypeX<T(*)(S)>
TypeX<T(*)(S)>
TypeX<T(*)(S, U)>
TypeX<T(*)(S, U)>
Демонстрация на ideone: http://www.ideone.com/fKxKK