找出类型

Finding out type

本文关键字:类型      更新时间:2023-10-16

所以我有一个默认C++vector的包装器。我的类是一个类似于vector的模板类,所以它基本上适用于我想要支持的所有类型。现在我有一个问题。我想在包装器中添加一个函数,让我将内部存储的vector保存到文件中。但是,我使用的库对C函数的C++接口很差,需要我传递一个void*和一个预定义类型列表的条目。

假设我有一门课:

template<class T>
class MyClass
{
    dataType type;
    std::vector<T> data;
    MyClass()
    {
        //
    }
};

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

  • float:foatType

  • int:intType

  • char:charType

问题:

  • 我怎样才能为班上的库获取正确的类型
  • 可以这样做吗,我只有编译时的类型检查

如果你只需要支持这三种类型,你可以使用一个专门实现的模板函数:

template<class T> class MyClass {
  ...
  f();
};
template<> MyClass<float>::f();
template<> MyClass<int>::f();
template<> MyClass<char>::f();

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

如果你只想支持某些类型的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);
}
...