在c ++中创建类模板的通用实例

时间:2014-01-14 19:03:57

标签: c++ templates

我正在用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()中加倍代码,因为它实际上很长。

3 个答案:

答案 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对象始终只调用saveFloatDatasaveIntData,而不是两者。

恕我直言,如果你要设计一个框架,那么对客户使用是一个不好的假设(限制)。

<强>更新
我能想到的另一个选择是模拟有问题的函数,而不是整个类:

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);
}