C 如何在编译时检查变体映射的类型
C++ How to check the type of a variant map at compile time
我想拥有一个键,值对的地图;键可以用作字符串或枚举类实现;但是这些值需要支持多种类型,例如int
或bool
现在,我想具有以下签名的功能
template<typename T>
void getOption(KeyClass key_, T& value_)
鉴于地图将是恒定的,是否可以使该函数在编译时检查类型?
例如,如果地图类似于{" start_time":2," can_abort":false}
上应有汇编错误bool can_abort;
getOption("start_time", can_abort);
如果您可以使用钥匙的枚举值,并且在编译时已知类型和值,为什么不只是一个普通的结构?
struct options_t {
int start_time;
bool can_abort;
};
如果您确实必须迭代不同类型的元素,则可以完整的Voodoo并使用Louis Dionne的Boost.hana库。它具有多类地图类。一切都将在编译时检查。
另外,如果您想要更多以运行时为导向的行为,并且想要灵活性W.R.T.您粘在地图中的类型,可以使用类型的擦除,然后将其制成std::unordered_map<std::string, std::any>
。std::any
类型保存,嗯,任何类型的值;但这取决于您知道要尝试从中提取哪种类型(如果您错了,就会得到例外( - 即,您不会进行编译时间检查。
对于使用变体 - 您可以使用这些变体,但是如果您的键为std::string
s,则在编译时将没有任何检查,因为std::string
S涉及堆分配。
相关文章:
- 值到类型的运行时映射
- 拥有映射的现代方法,该映射可以指向或引用已在堆栈上分配的不同类型的数据
- 如何将高维数据映射到特征类型?
- 如何使映射键具有两种不同的数据类型?
- 值和类型的简洁双向静态 1:1 映射
- 当 map 是一个整数数组并且由 operator[] 创建时,它是否初始化其映射类型
- 编译按映射类型获取元素的映射错误元组
- 模板.参数包扩展 - 重映射类型
- C++函数来返回基于参数的比较器通用映射类型?
- ATL ActiveX DLL 作为映射类型图像和数据加载了两次
- 如何在 C++ 中获取映射类型指针,映射
- 映射类型为的队列容器
- 如何使用boost::mutex作为std::map中的映射类型
- 正向声明映射的映射类型和C++11
- std::map何时调用映射类型的构造函数
- 基于映射类型c++解析和转换csv
- 模板类的映射类型签名(声明)
- c++映射类型的属性
- 使用映射类型会产生GCC错误:预期的未限定id在' for '之前
- 在 EIGEN 中单独声明和初始化映射类型矩阵