Специализация шаблона метода C ++ только для одного индекса

Я хочу выполнить специализацию шаблона только для одного индекса класса. Например, в следующем коде я хочу создать специализацию всякий раз, когда первым классом является 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) {
...
}

person entitledX    schedule 13.09.2011    source источник
comment
аналогичный вопрос: частичная специализация метода C ++   -  person Amro    schedule 23.03.2013


Ответы (2)


Вы можете, но вам нужно специализировать весь класс 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;
}
person Sergey Sirotkin    schedule 13.09.2011

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

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

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

person K-ballo    schedule 13.09.2011
comment
Я пытаюсь реализовать свою собственную хеш-таблицу, в которой ключ относится к классу K, а значение - к классу V. Однако я надеялся специализировать различные хеш-функции для различных типов K. В этом случае класс V все еще может быть произвольным. - person entitledX; 13.09.2011
comment
Вам следует взглянуть на то, как это делают наборы и карты unordered_ (хэш) в C ++ 11 или на их реализацию Boost: boost.org/doc/html/unordered.html - person K-ballo; 13.09.2011