可变的默认参数
Variadic default parameters
前几天我想编写一个多维映射程序,遇到了以下问题。通常,对于映射,您需要key
, cmp
(或less
)和hash
类型。在多维映射中,每个维度都需要一个。
现在,如何声明map类呢?我尝试了以下操作:
template<typename val, typename ... key, typename ... cmp, typename ... hash>
class multimap;
由于显而易见的原因,它没有工作,所以我想出了一个解决方案:
template<typename Key,
typename Cmp = std::less<Key>,
typename Hash = std::hash<Key>>
struct Dimension
{
using Key = Key;
using Cmp = Cmp;
using Hash = Hash;
};
template<typename Val, typename ... Dimensions>
class multimap;
// Example usage:
multimap<float, Dimension<int>, Dimension<float, some_cmp_t>> my_map;
虽然这有效,但它强制用户在所有地方重复Dimension<...>
,如果他只想声明一个简单的映射,这是不幸的,比如(int, int, int) -> float
,它看起来像multimap<float, Dimension<int>, Dimension<int>, Dimension<int>>
。我该怎么做才能让用户更满意?
注意,使用上面的声明,也不可能从为每个维度接受Comparator的潜在构造函数中推断出特定维度的类型。
如何使声明易于使用,以便
-
multimap<float, int, int, int>
导致(int, int, int) -> float
-
mulitmap<float, Dimension<int, some_cmp_t, some_hash_t>, int>
使用一个特殊的比较器和哈希函数在维度1上得到(int, int) -> float
。
通过helper trait传递每种类型,将非维度转换为维度:
template <typename T>
struct DimensionFilter
{
using type = Dimension<T>;
};
template <typename Key, typename Cmp, typename Hash>
struct DimensionFilter<Dimension<Key, Cmp, Hash>>
{
using type = Dimension<Key, Cmp, Hash>;
};
当你引用multimap
的参数包时,使用:
typename DimensionFilter<Dimensions>::type...
您还可以使multimap
成为别名模板,以便它引用的实际类型已经只接收Dimensions
:
namespace detail
{
template <typename Val, typename ... Dimensions>
struct multimap {};
}
template <typename Val, typename ... Dimensions>
using multimap = detail::multimap<Val, typename DimensionFilter<Dimensions>::type...>;
演示2
相关文章:
- 使函数参数默认为周围范围
- 如何将值传递给其参数(默认参数)
- 当“std::make_index_sequence”和“std::index_sequence”用于模板参数默认类型时
- C ,构造器中允许的参考参数默认值
- 哪些规则控制参数默认赋值?
- 错误:上一个规范后给出的参数默认参数
- 是否可以设计一个包含模板参数默认值的类
- 构造函数中参数C++默认值
- 如何设置依赖于其他参数的参数默认值
- C++模板参数默认函数实现
- QInput对话框参数默认值
- g++4.8.2上列表方法参数默认初始化时出错
- 在函数定义中指定参数默认值会导致错误 C2143:语法错误:'='之前缺少')'
- 函数模板:将第一个模板参数默认为第二个
- 模板模板参数默认可以引用其他模板类型的参数
- 参数默认为先例参数的值
- 如何修改一个类,使它只有一个成员函数,所有参数默认
- 内置类型的模板参数默认值
- 是否可以使用构造函数或对象作为其他类方法的参数默认值?
- 模板参数默认为更高版本