4

我想只为一个类的一个索引执行模板专业化。例如,在下面的代码中,我想在第一个类是 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) {
...
}
4

2 回答 2

5

你可以,但你需要专门化整个类“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;
}
于 2011-09-13T03:49:37.140 回答
0

您可以这样做,但您必须将 myclass 专门用于 < int, ? > 案例。这意味着在两种情况下都重复每个定义。完全取决于您想要什么,您可以使用继承或类似方法避免代码重复。没有进一步详细说明您的意图,答案是:

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

您可能会通过更具体的细节得到更好的答案,模板世界中有很多机会。

于 2011-09-13T03:36:08.727 回答