【发布时间】:2015-12-14 09:24:35
【问题描述】:
我很乐意获得并建议如何以“二维方式”处理 boost::variant。听起来很奇怪,但让我的代码说得更多(希望如此):
我编写了一个名为 Parameter 的类:
template<typename PARAM_TYPE, typename DATA_TYPE=double>
class Parameter : public quantity<PARAM_TYPE, DATA_TYPE>
{
...
}
上面定义的我的参数的示例用法:
Parameter<si::length, double> SampleParameter1;
Parameter<si::dimensionless, short> SampleParameter2;
正如我试图通过上面的示例解释的那样,我可以使用boost::units::si::??? 和不同的数据类型(如double, short, int 等)定义几种参数类型。
我的目标是构建一个std::map 容器,它可以存储任何Parameter 类型的实例(如上所示)。
因此我声明:
typedef boost::variant<Parameter<si::dimensionless, short>, Parameter<si::length, double> > SupportedParameterTypes;
std::map<int, SupportedParameterTypes> myMapStorage;
这工作得很好,但有一个我想解决的大缺点 - 我必须在上面定义的 SupportedParameterTypes 类型中定义我想支持的参数类型的每一个组合。
我的想法是定义 boost::mpl::vector 包含我想支持的所有参数类型:
typedef boost::mpl::vector<si::dimensionless, si::length> ParameterTypes;
另一方面,所有可能的参数数据类型都被支持:
typedef boost::mpl::vector<short, int, float, double> ParameterDataTypes;
我的烦恼来了:
typedef typename boost::make_variant_over<ParameterTypes>::type ParameterTypeVariants;
typedef typename boost::make_variant_over<ParameterDataTypes>::type ParameterDataVariants;
typedef boost::variant<Parameter<ParameterTypeVariants, ParameterDataVariants> > SupportedParameterTypes;
但是要定义由其他boost::variant 定义的东西 (Parameter) 的 boost::variant 似乎不起作用:o(
问题:如何定义std::map 容器来保存我在适当boost::mpl::vectors 中定义的所有Parameter 类型?
我想请您帮忙解决这个问题。也许像我写的那样编码它根本不是一个好主意/原则,谁知道呢。我的目标是通过 std::map 进行灵活的存储,以便能够保存我的所有参数,而不会让我的代码模棱两可。当然是在寻找智能解决方案:o)
非常感谢您对我的问题/寻求帮助的任何回复
【问题讨论】:
-
为什么分开
si类型和data类型的两个mpl向量(使它们之间的关系不那么明显)比像boost::variant<Parameter<si::dimensionless, short>, Parameter<si::length, double> >这样简单的东西更好? -
我之所以需要将两种类型分开,是因为任何参数类型都可以与任何数据类型相匹配。大约有 20 种 si:: 类型和大约 4 种数据类型。这会产生大量我想避免的组合。无论如何,谢谢你的回复!
标签: c++ c++11 boost boost-mpl boost-variant