如何将typename作为函数中的参数? (C ++)

时间:2009-06-01 23:15:43

标签: c++ file-io typename function-parameter

我需要能够将typename作为参数传递:

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时使用的类型的变量,我真的不想因为一个函数而重新设计整个程序,所以无论如何都要使用typename作为参数?

4 个答案:

答案 0 :(得分:12)

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

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

答案 1 :(得分: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);

答案 2 :(得分: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>();
}

答案 3 :(得分:-2)

编译程序后,没有类型的东西。这是C ++的风格。