C++:函数模板的问题
本人C#转过来的,对C++泛型这块不是很了解。
需求是这样的:本来写了若干函数生成不同类型的对象,通过取数据然后 obj1.value = 数据, obj2.width= 数据,...... 其中obj1,obj2是不同类型, 他们的成员也不一样,大约有7-8种类型,写7-8个函数实现,可以是可以,但是有点傻。所以想用函数模板来实现:
template<class T>
T generateObj(T &obj, data, int TypeId)
{
...
return obj;
}
可以通过TypeId来控制哪种类型怎么初始化, 我想问的是,怎么给每个类型的obj对象的成员变量赋值? C++?函数模板 泛型
[解决办法]
感觉你要通过元数据(data)生成不同的结构体T。
T是不同类型,其成员也不一样,所以生成方法也不一样,写多个函数是避免不了的,但可以使用统一的接口形式,便于上层调用.
class T1
{
int a;
string b;
bool FromData(const Data& cData); //统一接口
}
class T2
{
int a;
string b;
string c;
bool FromData(const Data& data); //统一接口
}
template<class T>
T generateObj(T &obj, const Data& data)
{
obj.FromData(data);
return obj;
}
[解决办法]
分别为不同的obj设计不同的generateObj全特化就行了。例如:
template< typename T >
T generateObj( T& obj );
template<>
obj1 generateObj< obj1 >( obj1& obj )
{
obj.a = ...;
obj.c = ...;
......
return obj;
}
template<>
obj2 generateObj< obj2 >( obj2& obj )
{
obj.b = ...;
obj.d = ...;
......
return obj;
}
...........
如果传入的实参不会产生重载二义的话,也可以用重载实现,但推荐函数模板实现。
[解决办法]
用模板实现,前提是所有的模板包含的类型有相同的操作符,比如都有==操作,这样就是可以写成统一的接口!