定义一个类,怎么实现类成员可配置?(boost)
定义一个类,如何实现类成员可配置?(boost)
由于多业务的需要,现在需要定义一个类保存数据及相关操作,每个业务的数据结构不一样,如何实现?
举例说明:
首先有三中业务,每种数据的数据结构不一样,分别为("|"表示分隔符):
A:int | char* | double |int | float |...
B:char* | int | int |double |float|...
C:char* | double| int | int |char* |...
然后用一个文件或者表定义A、B、C的数据类型。
在程序获取业务类型后,取相应的定义,实例化这个类,如何实现?
之前听人说,用到boost里面一种数据结构,我看了一下,还是没把握用哪种。
要实现到的效果是,使用attrid,就可以获取成员的值。
比如对于A业务,attrid为1,取的是第一位int的值;为2时,取的是第二位char*的值。
对于B业务,attrid为1,取的是第一位char*的值;为2时,取的是第二位int的值。
依次类推。
------解决方案--------------------
#include <boost/tuple/tuple.hpp>
using namespace boost;
//tuple 默认最多支持10个模板参数
typedef tuple< int,char*,double,int,float > A;
typedef tuple< char*,int,int,double,float > B;
typedef tuple< char*,doubl,int,int,char* > C;
A a(0, "", 0.1, 1, 0.1f);
或者:
A a = make_tuple(0, "", 0.1, 1, 0.1f);
访问:
a.get<0>();//0
a.get<1>();//“”
a.get<2>();//0.1
使用tuple的前提是必须事先(在编译期)就能确定所有数据的类型及个数(且个数不能超过10);否则,可用使用Windows中的VARIANT(CComVariant等)类型的数组(如果不方便使用Windows库,就自行编写一个)。
CComVariant values[5];
values[0] = CComVariant(0);
values[1] = CComVariant("");
values[2] = CComVariant(0.1);
values[0].iVal;
values[1].pcVal;
values[2].fVal;//写法可能有误,具体参考MSDN
------解决方案--------------------
10楼的代码漏写了四个参数的实现,修改一下:
由于多业务的需要,现在需要定义一个类保存数据及相关操作,每个业务的数据结构不一样,如何实现?
举例说明:
首先有三中业务,每种数据的数据结构不一样,分别为("|"表示分隔符):
A:int | char* | double |int | float |...
B:char* | int | int |double |float|...
C:char* | double| int | int |char* |...
然后用一个文件或者表定义A、B、C的数据类型。
在程序获取业务类型后,取相应的定义,实例化这个类,如何实现?
之前听人说,用到boost里面一种数据结构,我看了一下,还是没把握用哪种。
要实现到的效果是,使用attrid,就可以获取成员的值。
比如对于A业务,attrid为1,取的是第一位int的值;为2时,取的是第二位char*的值。
对于B业务,attrid为1,取的是第一位char*的值;为2时,取的是第二位int的值。
依次类推。
数据结构
------解决方案--------------------
#include <boost/tuple/tuple.hpp>
using namespace boost;
//tuple 默认最多支持10个模板参数
typedef tuple< int,char*,double,int,float > A;
typedef tuple< char*,int,int,double,float > B;
typedef tuple< char*,doubl,int,int,char* > C;
A a(0, "", 0.1, 1, 0.1f);
或者:
A a = make_tuple(0, "", 0.1, 1, 0.1f);
访问:
a.get<0>();//0
a.get<1>();//“”
a.get<2>();//0.1
使用tuple的前提是必须事先(在编译期)就能确定所有数据的类型及个数(且个数不能超过10);否则,可用使用Windows中的VARIANT(CComVariant等)类型的数组(如果不方便使用Windows库,就自行编写一个)。
CComVariant values[5];
values[0] = CComVariant(0);
values[1] = CComVariant("");
values[2] = CComVariant(0.1);
values[0].iVal;
values[1].pcVal;
values[2].fVal;//写法可能有误,具体参考MSDN
------解决方案--------------------
10楼的代码漏写了四个参数的实现,修改一下:
struct none {};
template< typename T1 = none, typename T2 = none, typename T3 = none, typename T4 = none >
struct Test
{
T1 A1;
T2 A2;
T3 A3;
T4 A4;
};
template< typename T1, typename T2, typename T3 >
struct Test< T1, T2, T3, none >
{
T1 A1;
T2 A2;
T3 A3;
};
template< typename T1, typename T2 >
struct Test< T1, T2, none, none >
{
T1 A1;
T2 A2;
};
template< typename T1 >
struct Test< T1, none, none, none >
{
T1 A1;
};
template< >
struct Test< none, none, none, none >
{
};