使用不同的模板参数调用模板类的对象
Calling object of template class with different template arguments
我正在尝试实现一个哈希表,该表可以用不同的方式调用,是否应该定义某些特定类型的哈希函数和相等运算符,如下所示:
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_func
和default_eguals_op
是在其他地方定义的函数。该类将使用默认值,除非在调用该类时提供了参数。
相关文章:
- 是什么让放置新调用对象的构造函数?
- 当我调用对象的方法时,对象的成员会发生变化
- 为什么静态数组成员变量在调用对象的实例后不显示任何内容?
- 这个C++编译器优化(在自身的实例上调用对象自己的构造函数)的名称是什么,它是如何工作的?
- 如何从构造函数副本 T(const T&)调用对象 T?
- C++17 如何保存泛型可调用对象以供以后使用
- 检查模板中 nullptr 的函数指针,了解任何类型的可调用对象
- 是否可以在编译时初始化对象的 C 样式函数指针,以便它调用对象的成员函数?
- 如何在C++中将可调用对象放入地图中?
- 在销毁期间从另一个线程调用对象上调用方法是否未定义行为?
- 广义 std::function (std::any 表示可调用对象)
- c++ 替换调用对象方法的宏函数
- 将可调用对象传递给采用 std::function 的构造函数
- 双指针在使用 new 时不调用对象构造函数
- 可调用对象作为默认模板参数
- 只需调用对象即可获取对象数据
- 如果用户尝试从 JS 调用对象的未定义函数C++则回调C++代码
- 如何将当前替代类型的 std::variant 传递给可调用对象?
- C++对象本身作为参数调用对象的方法
- 从移交的类调用对象