如何在C ++中为不同的模板类型使用不同的类定义? (类重载?)

时间:2015-05-17 00:49:44

标签: c++ templates hashtable overloading

我想做的是制作哈希表。为了提高效率,我希望它根据数据类型的不同而有效。例如:int的二次探测方法,字符串的单独链接方法。

我发现我可以使用typeid()函数来比较模板的typename。我可以在课程的定义中使用它,但是我担心它会减慢程序的速度。

我觉得类似于#34; Class Overloading"可以解决这个问题。但我从来没有听说过#Class; Class Overloading"。你认为解决这个问题的正确方法是什么?

谢谢。

1 个答案:

答案 0 :(得分:2)

  

“但我从来没有听说过”班级重载“。你认为解决这个问题的正确方法是什么?”

您可以为其界面使用模板类和特化(重载):

template<typename T>
class hash_table {
public:
    bool probe(const T& x);
    hash_table<T> chain(const T& x);
};

template<>
bool hash_table<int>::probe(const int& x) {
    // int specific implementation
} 
template<>
bool hash_table<std::string>::probe(const std::string& x) {
    // std::string specific implementation
} 
template<>
hash_table<int> hash_table<int>::chain(const int& x) {
    // int specific implementation
} 
template<>
hash_table<std::string> hash_table<std::string>::chain(const std::string& x) {
    // std::string specific implementation
} 

您还可以使用基类提供更灵活的变体来提供接口,并使用基于类型的选择器继承:

template<typename T>
class hash_table_base {
    virtual bool probe(const T& x) = 0;
    virtual hash_table_base<T> chain(const T& x) = 0;
    void some_common_code() {
        // ....
    }
};

class hash_table_int 
: public hash_table_base<int> {
    virtual bool probe(const int& x) {
    }
    virtual hash_table_base<int> chain(const T& x) {
    }
}

class hash_table_string 
: public hash_table_base<std::string> {
    virtual bool probe(const std::string& x) {
    }
    virtual hash_table_base<std::string> chain(const std::string& x) {
    }
}

template <typename T>
struct SelectImpl {
     typedef hash_table_base<T> BaseClass;
};

template<int> struct SelectImpl {
     typedef hash_table_int BaseClass;
};

template<std::string> struct SelectImpl {
     typedef hash_table_sting BaseClass;
};
template<typename T>
class hash_table
: public SelectImpl<T>::BaseClass {
};

对于后一个提案,您甚至可以将其扩展为Policy based design模式。