2

我需要能够将类型名作为参数传递:

int X = FileRead(file, 9, char);

FileRead(std::fstream, int pos, ???) 的概念是读取 pos*sizeof(无论类型是什么) 以获得所需的位置。我试过模板:

template<typename T>
T FileRead(std::fstream file, int pos, T type)
{
    T data;
    file.read(reinterpret_cast<char*>(&data), sizeof(data));
    return data;
}

但这要求我每次想使用 FileRead 时都创建一个要使用的类型的变量,而且我真的不想仅仅因为一个函数而重新设计整个程序,所以无论如何都要使用类型名作为参数?

4

4 回答 4

13

要将类型的名称用作参数,请使用模板。

template<typename T>
T FileRead(std::fstream &file, int pos)
{
    T data;
    file.read(reinterpret_cast<char*>(&data), sizeof(T));
    return data;
}

这假定该类型是默认可构造的。如果不是,我想你无论如何都很难将它从文件中流出来。

像这样称呼它:

char value=FileRead<char>(file, pos);

如果您不想在调用中指定类型,您可以修改您的 API:

template<typename T>
void FileRead(std::fstream &file, int pos, T &data)
{
    file.read(reinterpret_cast<char*>(&data), sizeof(T));
}

然后像这样调用它 - 推断类型:

char value;
FileRead(file, pos, value);
于 2009-06-01T23:18:16.750 回答
3

非常简单:

template<typename T>
T FileRead(std::fstream file, int pos)
{
    T data;
    file.read(reinterpret_cast<char*>(&data), sizeof(data));
    return data;
}

并通过以下方式调用它:

char x = FileRead<char>(file, pos);
于 2009-06-01T23:19:36.013 回答
0

我知道这篇文章得到了回答,但我仍然有一个问题,我从这个页面的答案中找到了一个简单的方法。您可以将类型名称传递给任何函数,如下所示:

template<typename T>
void function_name()
{
    //you can access your type here with T
    //you can create an object from T or anything you want
    //for example :

    T obj;

    //or:

    T obj=new T;

}

int main(){
    function_name<YourTypeName>();
}
于 2019-11-22T15:16:46.423 回答
-3

一旦你的程序被编译,就没有类型之类的东西了。这是 C++ 的风格。

于 2009-06-01T23:17:45.393 回答