Специализация шаблона метода C ++ только для одного индекса - PullRequest
4 голосов
/ 13 сентября 2011

Я хотел бы выполнить специализацию шаблона только для одного индекса класса. Например, в следующем коде я хочу создать специализацию, когда первый класс int, независимо от того, что является вторым классом. Есть ли способ реализовать это?

template <class K, class V>
class myclass {
    public:
        void myfunc(K,V);
};

template <class K, class V>
myclass<K,V>::myfunc(K key, V value) {
...
}

template< ,class V>
myclass<int,V>::myfunc(int key, V value) {
...
}

Ответы [ 2 ]

5 голосов
/ 13 сентября 2011

Можно, но нужно специализировать весь класс "myclass", а не только один метод "myfunc".Вот пример:

#include <iostream>

template <typename K, typename V>
class myclass {
    public:
        void myfunc(K key, V value)
        {
            std::cout << "non-specialized " << key << "->" << value << std::endl;
        }
};


template<typename V>
class myclass<int, V> {
    public:
        void myfunc(int key, V value)
        {
            std::cout << "specialized " << key << "->" << value << std::endl;
        }
};

int main(int argc, char* argv[])
{
    myclass<int, char> instance;
    instance.myfunc(10, 'a');

    myclass<long, char> instance2;
    instance2.myfunc(10L, 'a');

    return 0;
}
0 голосов
/ 13 сентября 2011

Вы можете сделать это, но вы должны специализировать myclass для Дело. Это означает повторение каждого определения в обоих случаях. В зависимости от того, что вы хотите, вы можете уйти, используя наследование или подобное, чтобы избежать дублирования кода. Без дополнительной информации о том, что вы намереваетесь, ответ:

template< class K, class V > class myclass { general definition };
template< class V > class myclass< int, V >{ general definition };

Вы можете получить лучший ответ с более подробной информацией, в мире шаблонов есть много возможностей.

...