我正在尝试实现一个可以以不同方式调用的哈希表,是否应该为某些特定类型定义哈希函数和相等运算符,如下所示:
struct FancyType{
//some data here
}
struct SomeHashStruct{
//operator() overload
}
struct SomeEqualStruct(){
//operator() overload
}
HashTable<string, FancyType, SomeHashStruct, SomeEqualStruct> table;
或者只定义键和值类型:
HashTable<string, string> table;
所以,我这样写:
template<typename K, typename V,
typename HashFunction, typename EqualOperator>
class HashTable {
public:
template<typename K, typename V>
HashTable() {
//some fields definition
}
template<typename K, typename V,
typename HashFunction, typename EqualOperator>
HashTable() {
//some fields definition
}
};
问题是第一个构造函数没有通过编译。 我该如何重写这个?是否有任何我错过的 C++ 功能,或者我可能只调用不同参数的不同构造函数才能做到这一点的唯一方法?
最佳答案
两个问题都由同一个解决方案解决。
问题 1:阴影模板参数。该类建立K
,然后K
被构造函数重用。唯一的出路就是不这样做。您可以使用其他名称,但当您对同一事物使用两个名称时,最常见的结果是混淆,您会发现没有必要分别对函数进行模板化。
问题 2:模板参数不参与重载决议,除非通过其类型由模板参数决定的参数。由于两个构造函数都没有任何参数,因此它们具有相同的签名并且无法区分。
解决方案:使用default template arguments .
template<typename K, typename V,
typename HashFunction=default_hash_func,
typename EqualOperator=default_eguals_op>
class HashTable {
public:
HashTable() {
//some fields definition
}
};
其中 default_hash_func
和 default_eguals_op
是在别处定义的函数。该类将使用默认值,除非在调用该类时提供参数。
关于c++ - 使用不同的模板参数调用模板类的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59123374/