找出类型

时间:2016-05-19 14:14:40

标签: c++ templates types

所以我有一个默认C ++ vector的包装器。我的类是一个像vector这样的模板类,所以它基本上适用于我想要支持的所有类型。现在我有一个问题。我想在我的包装器中添加一个函数,让我将内部存储的vector保存到文件中。但是,我用来执行此操作的库具有较差的C函数C ++接口,并要求我传递void*和预定义类型列表的条目。

假设我有班级:

template<class T>
class MyClass
{
    dataType type;
    std::vector<T> data;

    MyClass()
    {
        //
    }
};

我有三种我想支持的类型(例如):

  • float:floatType

  • int:intType

  • char:charType

问题:

  • 如何在班上为图书馆获取正确的类型?
  • 可以这样做,以便我只进行编译时类型检查吗?

2 个答案:

答案 0 :(得分:2)

如果您只需要支持这三种类型,您可以使用模板功能,专门为它们实现:

template<class T> class MyClass {
  ...
  f();
};

template<> MyClass<float>::f();
template<> MyClass<int>::f();
template<> MyClass<char>::f();

并在关联的C ++文件中准确提供这些参数的实现。当使用另一个模板参数在实例上调用f()时,链接器会抱怨缺少符号,因为没有可用的专用实现。

答案 1 :(得分:0)

如果您只想支持某些类型的T,您可以隐藏模板并提供您想要的类型:

typedef MyClass<int> MyClass_32s;
typedef MyClass<float> MyClass_32f;
...

之后你可以为你的c接口编写一个包装器:

void passToCInterface(MyClass_32s& dat) 
{
   callCInterfaceFunction(static_cast<void*>(&(dat.data)), INT_FLAG);
}

void passToCInterface(MyClass_32f& dat) 
{
   callCInterfaceFunction(static_cast<void*>(&(dat.data)), FLOAT_FLAG);
}

...