添加具有模板专用化的方法
Adding methods with template specialization
我有一个名为 Map 的哈希表容器,方法如下:
Value Map<Key, Value>::valueFor(const Key& key);
不幸的是,最常用的情况是Key = std::string
我们通常使用字符串文字调用该方法,例如:
const Value v = map.valueFor("my_key");
我们失去了一些循环来创建std::string
。因此,我想添加一个重载
Value Map<std::string, Value>::valueFor(const char* key);
当Key = std::string
.我相信编译器甚至可以在编译时使用这样的签名计算哈希,这也将有助于加快速度。
有没有办法在没有专门化整个 Map 类的模板并重写所有方法的情况下C++11
做到这一点?
您可以添加另一个重载valueFor(char const * key)
。 如果Key
未std::string
,您可能还想使用 SFINAE 禁用此重载。
#include <iostream>
#include <string>
#include <type_traits>
template < typename Key, typename Value >
struct Map
{
Value valueFor(Key const& key)
{
std::cout << "valueFor(const Key& key)n";
return Value{};
}
template < typename _Key = Key,
typename = typename std::enable_if< std::is_same < _Key, std::string >::value >::type >
Value valueFor(char const * key)
{
std::cout << "valueFor(char const * key)n";
return Value{};
}
};
int main()
{
Map<std::string, int> map;
int v = map.valueFor("my_key");
Map<int, int> other_map;
//int v = other_map.valueFor("my_key"); // BOOM!
}
只是削弱了你的类型要求。你的valueFor
不关心参数是什么类型,只要表达式hash<Key>(arg)
有效。
因此,您可以模板valueFor
其参数类型,并专门化哈希函数,并在必要时专门设置密钥比较器。
例如。(未经测试,为简洁起见,使用 C++17string_view
(
template <typename K>
struct Hasher
{
static size_t hash(K const &k) { return std::hash<K>()(k); }
};
template <>
struct Hasher<std::string>
{
static size_t hash(std::string const &s) {
return std::hash<std::string>()(s);
}
static size_t hash(std::string_view const &sv) {
return std::hash<std::string_view>()(sv);
}
static size_t hash(const char *cstr) {
return std::hash<std::string_view>()({cstr});
}
};
template <typename Key, typename Value>
template <typename KeyArg>
Value Map<Key,Value>::valueFor(KeyArg&& arg)
{
auto hash = Hasher<Key>::hash(std::forward<KeyArg>(arg));
// ...
}
相关文章:
- 检查子类型时的专用方法模板
- 部分方法专用化
- 基于枚举参数调用专用模板方法
- 类中一种方法的部分专用化
- 从非模板类调用专用模板方法
- 使用类指针重载C++命名空间函数模板专用化替代方法?
- 没有针对完全专用模板类的外联虚拟方法定义
- 从部分专用模板方法调用模板非静态方法
- 添加具有模板专用化的方法
- 常量字符*的模板方法专用化
- C++隐式/显式模板方法专用化问题
- enable_if在类声明之外实现的方法专用化
- 类模板:为什么我不能将单一方法专用于空类型?
- 混合显式类专用化和类方法专用化
- 显式模板专用化不能具有存储类 - 成员方法专用化
- 不完整类型(类方法专用化)的使用无效
- 显式模板函数和方法专用化
- *nix 上的模板方法专用化
- "Faking" 具有enable_if的模板类方法专用化
- 用于多种类型的模板方法专用化