Скажем, у меня есть шаблонный класс вроде
template <typename T> struct Node
{
// general method split
void split()
{
// ... actual code here (not empty)
}
};
. Нужно специализировать это в случае класса Triangle ... что-то вроде
template <>
struct Node <Triangle*>
{
// specialise the split method
void split() {}
} ;
, но я не хочу переписывать весь шаблон заново! Единственное, что нужно изменить, - это метод split ()
, не более того.
Вы можете предоставить специализацию только для этой функции вне объявления класса.
template <typename T> struct Node
{
// general method split
void split()
{
// implementation here or somewhere else in header
}
};
// прототип функции, объявленной в cpp void splitIntNode (Node & amp; node);
template <>
void Node<int>::split()
{
splitIntNode( this ); // which can be implemented
}
int main(int argc, char* argv[])
{
Node <char> x;
x.split(); //will call original method
Node <int> k;
k.split(); //will call the method for the int version
}
Если splitIntNode
нужен доступ к закрытым членам, вы можете просто передать эти члены в функция, а не весь узел.
Ваш случай - удачный пример, потому что вы полностью специализируете шаблон. Другими словами, существует только один аргумент шаблона, и для функции, которую вы хотите специализировать, вы предоставляете полностью специализированную реализацию этого определения функции. К сожалению, для частичной специализации шаблонов классов требуется повторная реализация класса.
Например, это работает:
template<typename T, typename U>
struct Node
{
void function() { cout << "Non-specialized version" << endl; }
};
template<>
void Node<int, char>::function() { cout << "Specialized version" << endl; }
Частично специализированная версия, однако, не будет работать:
template<typename T, typename U>
struct Node
{
void function() { cout << "Non-specialized version" << endl; }
};
template<typename U>
void Node<int, U>::function() { cout << "Specialized version" << endl; }
Что вы можете сделать, если окажетесь во втором сценарии, чтобы избежать ненужного дублирования кода, следует упаковать все общие элементы в общий базовый класс, а затем поместить все элементы, которые будут изменяться с частичной специализацией, в производный класс. Таким образом, вам не нужно дублировать весь общий код в базовом классе, вам нужно будет только переписать определения для специализированного производного класса.