我正在用c ++制作模板库。我认为它需要采用模板类的形式,因为它必须能够存储一些数据。我希望能够创建该类的实例,而无需指定数据类型。
这是类模板的样子
template<class T>
class MyTemplateClass{
public:
void saveData(T data);
private:
T my_data;
};
template<class T>
void MyTemplateClass<T>::saveData(T data){
//bunch of code goes here
}
以下是我要宣布的方式:
class LibraryUser{
public:
void saveDoubleData(double data);
void saveFloatData(float data);
private:
MyTemplateClass<UNKNOWN_TYPE> my_generic_object;
};
并使用它:
void LibraryUser::saveDoubleData(double data){
my_generic_object.saveData(data);
}
void LibraryUser::saveFloatData(float data){
my_generic_object.saveData(data);
}
UNKNOWN_TYPE应该是什么?这可能吗?
额外注意事项:我无法编辑LibraryUser
类的函数原型,因为它是现有插件框架的一部分。我宁愿不使用模板专门化,因为我不想在saveData()中加倍代码,因为它实际上很长。
答案 0 :(得分:0)
您也应该将LibraryUser
类设为模板:
template<class T>
class LibraryUser{
public:
void saveData(T data);
private:
MyTemplateClass<T> my_generic_object;
};
或者,如果类型确实未知,则可以使用boost::any
;如果类型属于指定的类型集,则可以使用boost::variant
。
答案 1 :(得分:0)
为什么不使用模板类的本地实例,而不是拥有类成员?
void LibraryUser::saveIntData(float data){
MyTemplateClass<float> saver;
saver.saveData(data);
}
void LibraryUser::saveFloatData(int data){
MyTemplateClass<int> saver;
saver.saveData(data);
}
如果MyTemplateClass
需要s.th.你想初始化一次(例如一个数据库连接),分别为那个创建一个类成员(在LibraryUser
中)并传递对MyTemplateClass
的构造函数的引用:
template<class T>
class MyTemplateClass{
public:
MyTemplateClass(DBConnection& conn);
void saveData(T data);
private:
T my_data;
DBConnection& my_conn;
};
class LibraryUser{
public:
void saveIntData(int data);
void saveFloatData(float data);
private:
DBConnection my_conn;
};
void LibraryUser::saveIntData(float data){
MyTemplateClass<float> saver(my_conn);
saver.saveData(data);
}
关于您的附注:
也可以安全地假设给定的OtherClass对象始终只调用
saveFloatData
或saveIntData
,而不是两者。
恕我直言,如果你要设计一个框架,那么对客户使用是一个不好的假设(限制)。
<强>更新强>
我能想到的另一个选择是模拟有问题的函数,而不是整个类:
class MyGenericClass{
public:
MyGenericClass();
template<class T>
void saveData(T data);
};
答案 2 :(得分:0)
模板类实际上彼此不同,因此如果不使用某些技巧,就无法真正更改模板类型运行时。如果您不想使LibraryUser
也成为模板,则可以存储多个变量。在这种情况下,如果您想省去重复每个代码的麻烦,但是您使用的数量有限,只需使用多个变量并存储实际使用的变量。不是很好,但可以避免你制作更多的模板类。
class LibraryUser{
public:
void saveIntData(int data);
void saveFloatData(float data);
private:
MyTemplateClass<int> my_int;
MyTemplateClass<float> my_float;
};
使用它:
void LibraryUser::saveFloatData(float data){
my_float.saveData(data);
}
void LibraryUser::saveIntData(int data){
my_int.saveData(data);
}