我想只为一个类的一个索引执行模板特化。例如,在下面的代码中,我想在第一个类为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) {
...
}
答案 0 :(得分: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;
}
答案 1 :(得分:0)
你可以这样做,但你必须专门为myclass设置&lt; int,? &GT;案件。这意味着在两种情况下重复每个定义。完全取决于您的需要,您可以使用继承或类似方法逃脱,以避免代码重复。没有关于你想要的更多细节,答案是:
template< class K, class V > class myclass { general definition };
template< class V > class myclass< int, V >{ general definition };
您可以通过更具体的细节获得更好的答案,模板世界中有很多机会。