使用不同的模板参数调用模板 class 的对象
Calling object of template class with different template arguments
我正在尝试实现一个可以用不同方式调用的散列 table 是否应该为某些特定类型定义散列函数和相等运算符,如下所示:
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:阴影模板参数。 class 建立 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
是别处定义的函数。 class 将使用默认值,除非在调用 class 时提供参数。
我正在尝试实现一个可以用不同方式调用的散列 table 是否应该为某些特定类型定义散列函数和相等运算符,如下所示:
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:阴影模板参数。 class 建立 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
是别处定义的函数。 class 将使用默认值,除非在调用 class 时提供参数。