Если я хочу выделить только один метод в шаблоне, как мне это сделать?

Скажем, у меня есть шаблонный класс вроде

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 () , не более того.

27
задан Mike Seymour 17 February 2012 в 15:19
поделиться

2 ответа

Вы можете предоставить специализацию только для этой функции вне объявления класса.

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 нужен доступ к закрытым членам, вы можете просто передать эти члены в функция, а не весь узел.

31
ответ дан 28 November 2019 в 05:18
поделиться

Ваш случай - удачный пример, потому что вы полностью специализируете шаблон. Другими словами, существует только один аргумент шаблона, и для функции, которую вы хотите специализировать, вы предоставляете полностью специализированную реализацию этого определения функции. К сожалению, для частичной специализации шаблонов классов требуется повторная реализация класса.

Например, это работает:

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; }

Что вы можете сделать, если окажетесь во втором сценарии, чтобы избежать ненужного дублирования кода, следует упаковать все общие элементы в общий базовый класс, а затем поместить все элементы, которые будут изменяться с частичной специализацией, в производный класс. Таким образом, вам не нужно дублировать весь общий код в базовом классе, вам нужно будет только переписать определения для специализированного производного класса.

5
ответ дан 28 November 2019 в 05:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: