带有嵌套映射的可变参数模板参数推断

内森·皮尔森(Nathan Pierson)

在C ++中工作,有时候我正在使用嵌套地图。例如,假设:

enum Color { RED, GREEN, BLUE};
enum Shape { CIRCLE, SQUARE, TRIANGLE };
std::unordered_map<Color, std::unordered_map<Shape, int>> shapeColorCount;

对于这些情况,使用可变参数模板来编写以键的类型为模板的setter和getter函数将很有用。目标将是这样的:

template<typename TValue, typename TKeys...>
TValue& nestedGet(MapTypeHere t_map, const TKeys&... t_keys);
void nestedSet(MapTypeHere t_map, const TValue& t_value, const TKeys&... t_keys);

递归地定义这些函数不是很困难,但是我的主要问题是使模板参数的类型推断正常工作。问题是指定MapTypeHere。我几乎可以写类似

template<typename TValue, typename TKey>
using Map = std::unordered_map<TKey, TValue>;

template<typename TValue, typename TOuterKey, typename... TInnerKeys>
using Map = std::unordered_map<TOuterKey, Map<TValue, TInnerKeys...>;

template<typename TValue, typename... TKeys>
TValue& nestedGet(Map<TValue, TKeys...>& t_map, const TKeys&... t_keys);
void nestedSet(Map<TValue, TKeys...>& t_map, const TValue& t_value, const TKeys&... t_keys);

尝试创建使用指令的递归,但它抱怨说,当我尝试使用基本参数作为时,我试图在非包装模板变量中使用参数包装Map如果我将它们包装在结构中,似乎允许它使用声明来执行此递归操作,但是然后我遇到了类型推断不起作用的问题。回到上面的例子:

std::unordered_map<Color, std::unordered_map<Shape, int>> shapeColorCount
nestedSet<int, Color, Shape>(shapeColorCount, 5, Color::RED, Shape::SQUARE); // This works
nestedSet(shapeColorCount, 5, Color::RED, Shape::SQUARE); // It can't figure out the types for the template

有没有办法使此设置正常工作?

慈济

是的,您可以编写以下函数:

template<typename Map, typename Value, typename FirstKey, typename ...RestKeys>
void nestedSet(Map& map, Value const& value, FirstKey const& key, RestKeys const&... rest_keys)
{
    if constexpr(sizeof...(RestKeys) == 0)
        map[key] = value;
    else
        nestedSet(map[key], value, rest_keys...);
}

template<typename Map, typename FirstKey, typename ...RestKeys>
auto& nestedGet(Map& map, FirstKey const& key, RestKeys const&... rest_keys)
{
    if constexpr(sizeof...(RestKeys) == 0)
        return map[key];
    else
        return nestedGet(map[key], rest_keys...);
}

请注意,此解决方案不依赖于特定的unordered_map<Color, std::unordered_map<Shape, int>>实例。它适用于键和值类型的任何实例化,以及嵌套unordered_maps的任何深度

这是一个演示

另外,如果您没有c ++ 17,则可以if constexpr使用带有单个KeyType参数的重载模板重写解决方案

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

带有可变参数模板参数的boost :: format

带有可变参数模板参数的重载函数

无法推断可变参数模板的模板类型

可变参数模板对

clang不使用可变参数推断可变参数模板函数中的模板参数

C ++:如何在可变参数模板参数上调用带有类型参数的函数?

C ++ 11翻译可变参数模板以推断类类型

基于模板参数构建带有一组函数重载的可变参数模板类?

带有两个模板参数的可变参数模板推导失败

带有可变参数模板构造函数的推导指南和可变参数类模板-参数包长度不匹配

为什么这个嵌套的可变参数模板是无效的参数?

带有可变参数模板参数的成员函数的显式专业化

С++可变参数模板:实现可变参数

在带有可变参数模板的基于模板的类中进行完善转发?

C ++模板元编程,带有可变参数模板以执行结构中特定成员的操作

带有可变参数模板的模板特化,用于创建方法

编译器无法推断可变参数模板的模板参数

尝试解析可变参数模板时,“无法推断出模板参数“ T”

可变参数模板类的可变参数模板

在没有参数的可变参数模板中迭代

具有可变参数模板参数的函数指针

检查所有可变参数模板参数的特征

C ++中没有参数可变参数模板函数

可变参数模板提取

可变参数模板示例

可变参数模板的论点

可变参数模板功能

可变参数模板问题

空包可变参数模板