使用不同的模板参数调用模板类的对象

Calling object of template class with different template arguments

本文关键字:调用 对象 参数      更新时间:2023-10-16

我正在尝试实现一个哈希表,该表可以用不同的方式调用,是否应该定义某些特定类型的哈希函数和相等运算符,如下所示:

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:模板参数不参与重载解析,除非通过其类型由模板参数决定的参数。由于两个构造函数都没有任何参数,因此它们具有相同的签名并且无法区分。

解决方案:使用默认模板参数。

template<typename K, typename V,
typename HashFunction=default_hash_func, 
typename EqualOperator=default_eguals_op>
class HashTable {
public:
HashTable() {
//some fields definition
}
};

其中default_hash_funcdefault_eguals_op是在其他地方定义的函数。该类将使用默认值,除非在调用该类时提供了参数。