仅针对一个索引的 C++ 方法模板特化

Posted

技术标签:

【中文标题】仅针对一个索引的 C++ 方法模板特化【英文标题】:C++ method template specialization for only one index 【发布时间】:2011-09-13 03:32:15 【问题描述】:

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

【问题讨论】:

类似问题:C++ partial method specialization 【参考方案1】:

你可以,但你需要专门化整个类“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;

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

我正在尝试实现自己的哈希表,其中键属于 K 类,值属于 V 类。但是,我希望为各种类型的 K 专门化不同的哈希函数。在这种情况下,V 类仍然可以是任意的。 您应该看看 C++11 unordered_(hash)sets 和 maps 是如何做到这一点的,或者它们的 Boost 实现:boost.org/doc/html/unordered.html

以上是关于仅针对一个索引的 C++ 方法模板特化的主要内容,如果未能解决你的问题,请参考以下文章

这是为成员函数的 C++ 模板部分特化构造类的好方法吗?

C++模板进阶

C++模板进阶操作 —— 非类型模板参数模板的特化以及模板的分离编译

虚拟方法的 C++ 部分模板特化

C++初阶:模板进阶非类型模板参数 | 模板的特化 | 模板分离编译

C++初阶:模板进阶非类型模板参数 | 模板的特化 | 模板分离编译