从字符串/ boost :: any映射构建boost :: option
||
我有一个代表配置的地图。这是
std::string
和boost::any
的地图。
此映射在开始时已初始化,我希望用户能够在命令行上覆盖这些选项。
我想做的是使用options_description::add_option()
方法从此地图构建程序选项。但是,它使用模板参数po::value<>
,而我仅有的是boost::any
。
到目前为止,我只有代码的外壳。 m_Config
代表我的配置类,getTuples()
返回一个std::map<std::string, Tuple>
。 TuplePair
是std::pair<std::string, Tuple>
的typedef,元组包含我感兴趣的boost::any
。
po::options_description desc;
std::for_each(m_Config.getTuples().begin(),
m_Config.getTuples().end(),
[&desc](const TuplePair& _pair)
{
// what goes here? :)
// desc.add_options() ( _pair.first, po::value<???>, \"\");
});
有没有办法以这种方式构建它,还是我需要自己动手做?
提前致谢!
没有找到相关结果
已邀请:
2 个回复
柑恫祟
不适用于您的问题。它执行类型擦除的最基本形式:存储和(类型安全)检索,仅此而已。如您所见,无法执行其他任何操作。正如jhasse指出的那样,您可以只测试要支持的每种类型,但这是维护的噩梦。 更好的是扩展“ 1”用法的想法。不幸的是,这需要一些样板代码。如果您想尝试一下,现在在邮件列表中正在讨论一个新的Boost库(标题为““ [boost] RFC:type erasure \”),它实际上是一种通用的类型擦除实用程序:您定义您希望擦除类型支持的操作,它会生成正确的实用程序类型。 (例如,可以通过要求已擦除的类型是可复制构造且类型安全的来模拟
,并通过另外要求该类型可以被调用来模拟
。) 但是除此之外,最好的选择可能是自己编写一个这样的类型。我会为您做的:
让我知道是否有不清楚的地方。 :)
缝皋
如果类型不只一种,请考虑使用类型列表。