Операторы Double template <>
Существует такое определение функции:
template<>
template<>
void object::test<1>()
{
}
Что это значит, что есть двойной шаблон < > ?
EDIT:
Я извлек код, который действителен для этого примера:
#include <iostream>
template <class U>
class A {
template <int n>
void test() {
}
};
template <class T>
class B {
public:
typedef A<T> object;
};
typedef B<int>::object object;
template<>
template<>
void object::test < 1 > () {
}
int main() {
return 0;
}
Этот код компилируется под g++.
Источник: Тестовая среда TUT
Ответы
Ответ 1
Например,
template<class T = int> // Default T is int
class object<T> {
template<int R> void test ();
};
Ваш код:
template<> // T is fixed
template<> // R is fixed
void object<>::test<1>() // T is default int, R is 1
{
}
эквивалентно:
template<> // T is fixed
template<> // R is fixed
void object<int>::test<1>() // T is int, R is 1
{
}
Ответ 2
Это шаблонная специализация шаблона функции члена шаблона шаблона (я получил это правильно?) с параметром по умолчанию для шаблона. Посмотрите на это:
template<typename T = int>
struct X {
template<typename U>
void foo(U u);
};
template<>
template<>
void X::foo(float f) { }
Это вводит специализацию для случая, когда параметр шаблона X
равен int
, а аргумент X<int>::foo
- float
. Этот случай немного отличается от вашего, мы не должны предоставлять аргумент шаблона явно после имени функции-члена, как это может быть выведено. У вашей функции есть аргумент шаблона не-типа, который не может быть выведен и как таковой должен быть предоставлен.
Что меня больше смущает, так это аргумент шаблона по умолчанию, и я не уверен, что это хорошая практика для использования пропустить его. Я бы предоставил его для каждой специализации, чтобы избежать путаницы.
Ответ 3
Это выглядит как специализация шаблона функции в шаблоне класса. Например, рассмотрим следующее определение шаблона класса:
template <int m=1>
class object
{
public:
template <int n>
void test();
};
// This differs from your example, by the addition of `<>` after `object`, but it as
// close as I can come to valid code true to your example
template<>
template<>
void object<>::test<1>()
{
}