C++中的多类型容器
Multi-type container in C++
我正在寻找一个C++类来存储要用作全局配置机制的多类型参数。
以下近似值存储了param_name - param_value对。其中参数值为多类型。
有人知道为此目的的任何图书馆或替代方案吗?
以下代码有什么替代方法吗?
#ifndef _GLOBAL_CONFIG_HPP_
#define _GLOBAL_CONFIG_HPP_
#include <boost/any.hpp>
#include <boost/lexical_cast.hpp>
#include <boost/optional/optional.hpp>
#include <map>
#include <string>
#include <ostream>
#include <typeinfo>
namespace GC
{
class Global_Config
{
public:
typedef std::string label_t;
typedef std::map< label_t, boost::any > data_m_t;
private:
data_m_t data_m_;
public:
template< class T >
void get( boost::optional< T >& data, const label_t& label )
throw ( boost::bad_any_cast, std::bad_alloc )
{
data_m_t :: iterator it = data_m_.find( label );
data = ( it == data_m_.end( ) ) ?
boost::optional< T >( ) : boost::any_cast< T >( it->second );
}
template< class T >
void set( const label_t& label, const T& data )
{
data_m_[ label ] = data;
}
friend std::ostream& operator<< ( std::ostream& os, const Global_Config& gc );
};
class ex_chk_type_ok : public std::exception { };
// WARNING: throwing ex when type found for performance purposes!!!!
template< class T >
void ostream_over_global_config_chk_type( std::ostream& os,
const boost::any& value)
{
if( value.type( ) == typeid( T ) )
{
os << boost::any_cast< T > ( value );
throw ex_chk_type_ok( );
}
}
std::ostream& operator<<( std::ostream& os, const Global_Config& gc )
{
for( Global_Config::data_m_t:: const_iterator it( gc.data_m_.begin( ) );
it != gc.data_m_.end( ); ++it )
{
os << it->first << ("=");
try
{
ostream_over_global_config_chk_type< bool > ( os, it->second );
ostream_over_global_config_chk_type< char > ( os, it->second );
ostream_over_global_config_chk_type< short > ( os, it->second );
ostream_over_global_config_chk_type< unsigned short> ( os, it->second );
ostream_over_global_config_chk_type< int > ( os, it->second );
ostream_over_global_config_chk_type< unsigned int> ( os, it->second );
ostream_over_global_config_chk_type< float > ( os, it->second );
ostream_over_global_config_chk_type< long> ( os, it->second );
ostream_over_global_config_chk_type< unsigned long > ( os, it->second );
ostream_over_global_config_chk_type< long long > ( os, it->second );
ostream_over_global_config_chk_type< unsigned long long >( os, it->second );
ostream_over_global_config_chk_type< double > ( os, it->second );
ostream_over_global_config_chk_type< long double > ( os, it->second );
ostream_over_global_config_chk_type< wchar_t > ( os, it->second );
ostream_over_global_config_chk_type< std::string > ( os, it->second );
} catch( ex_chk_type_ok &ex )
{
//Do nothing, ex to break checkings for performance purposes...
}
os << "(" << it->second.type( ).name( ) << ")";
if( it != gc.data_m_.end( ) ) os << ";";
}
return os;
}
}; // ns GC
#endif
最动态的配置方式是 Poco::D ynamicAny 行。
这就像任何一样,但在检索值时不需要强制转换。给定一个DynamicAny
的对象,你可以做:
DynamicAny d{100.2};
//Note that there is no need for casting
double my_double = d;
配置的另一种选择是Boost.Program_Options,我认为这主要用于命令行,但也可用于从文件,如果我记错了。Boost.PropertyTree.主要用于分层配置文件。
相关文章:
- 实现多类型算术运算符时如何解决"template argument deduction/substitution failure"
- 如何使用模板处理多类型变量?
- 如何获取多类型向量中的值(不添加 <type>)?
- C++:是否可以制作多类型函数参数?
- 在模板专业化中添加更多类型
- 多类型标准映射
- 多类型数据类 c++
- C3857不允许使用多类型参数列表编译器错误
- 有没有一种更干净的方法可以在c++(11)中复制具有多类型值的无序映射
- C++中的多类型容器
- C++多类型数组
- 多类型容器(数组/向量/列表)传统上是如何在C++实现的?(当然没有元组)
- C++ 多类型对象的想法
- 如何创建多维多类型c++向量
- 将多类型数据存储在非类型化存储器空间中
- 在单个结构下管理多类型对象
- c++多类型模板使用指南
- 多类型的c++映射
- 多态性中的多类型输出
- 如何使用模板编程创建多类型数组