将typedef与构造函数参数一起使用
Using typedef with a constructor parameter
在我之前的问题"根据类模板定义类成员"之后,我意识到unordered_map
的默认bucket计数对我来说太低了。
我有一个类模板Base
,它将使用映射或无序映射,具体取决于模板参数:
template<class A, class B>
class Base {
template<class T1, class T2>
struct MapType { typedef boost:unordered_map<...> MType; };
template<class T2>
struct MapType<std::string, T2> { typedef std::map<...> MType; };
typedef typename MapType<...>::MType Map;
Map mMap;
};
如果Map
是后一种类型,我想通过使用其consturator(第一个参数定义大小(或使用无序映射rehash
函数来更改其默认大小。
到目前为止,我唯一的想法是使用Base
类构造函数来检查(dynamic_cast
?(我的mMap
是映射还是无序映射,然后使用rehash
函数。
唯一的限制是,该代码在数百个地方使用,这些地方不能更改(不能多态化我的基类(。
由于MapType
已经是一个特征类,用于抽象Map
的某些方面(其类型(,因此可以将其扩展为抽象另一个方面(构造(:
template<class A, class B>
class Base {
template<class T1, class T2>
struct MapType {
typedef boost:unordered_map<...> MType;
static MType create() { return MType(BUCKET_SIZE); }
};
template<class T2>
struct MapType<std::string, T2> {
typedef std::map<...> MType;
static MType create() { return MType(); }
};
typedef typename MapType<...>::MType Map;
Map mMap;
Base() : mMap(MapType<...>::create()) {}
}
当然,您可以将一些参数传递到create
中(在一种或另一种情况下忽略部分/全部参数(,或者根据您的实际用例需求,让类似create
的函数在现有映射上操作,而不是返回新映射。
相关文章:
- 如何将enable-if与模板参数和参数包一起使用
- 如何使我的 sizeof sum 结构与空参数包一起工作
- 将 out/in out 参数与 if/switch 的 init 语句一起使用
- 概念可以与模板模板参数一起使用吗?
- 如何在Visual Studio 2017上将类方法设置为参数并将它们与lambda一起使用?
- 为什么当我尝试将priority_queue与参数一起使用作为指向结构的指针时会弹出错误
- 标准::原子::compare_exchange与两个memory_order参数一起使用的真实示例
- 如何在 C++ 中将 typedef 与类初始值设定项参数一起使用?
- 我可以将"token pasting operator"与"const"模板参数一起使用吗?
- 如何将可选参数与基于 QAxFactory 的 API 一起使用
- 哪个强制转换应与模板类参数一起使用,dynamic_cast或reinterpet_cast?
- 使用 std::vector<Particle> 粒子;函数 .at() 不能与迭代器一起使用,它作为 for 循环中的参数
- 有没有一种干净(更)的方法将 CRTP 与可变参数继承混合在一起?
- 将 auto 与生成元组的可变参数模板一起使用
- 将 boost::function 与指向派生类的共享指针的参数一起使用
- 当没有显式关键字与单参数构造函数一起使用时,编译器可以发出警告
- 类模板参数扣除是否可与STD :: MAP一起使用
- 当将 getline 与 int 一起使用时,如何修复"没有重载函数 'getline' 的实例与参数列表匹配"
- 如果与 QProcess 一起传递,则无法识别参数
- 如何将 #ifndef 与宏参数一起使用