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

C++ 如何将typename作为函数中的参数?(C+;+;),c++,file-io,typename,function-parameter,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_ca

我需要能够将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;
}
模板
T FileRead(std::fstream文件,int-pos,T-type)
{
T数据;
read(reinterpret_cast(&data),sizeof(data));
返回数据;
}

但这需要我创建一个类型的变量,以便在每次使用FileRead时使用,而且我真的不想仅仅因为一个函数就重新设计整个程序,所以有没有必要使用typename作为参数?

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

< p>使用类型的名称作为参数,使用模板。< /P>
template<typename T>
T FileRead(std::fstream &file, int pos)
{
    T data;
    file.read(reinterpret_cast<char*>(&data), sizeof(T));
    return data;
}
非常简单:

template<typename T>
T FileRead(std::fstream file, int pos)
{
    T data;
    file.read(reinterpret_cast<char*>(&data), sizeof(data));
    return data;
}
模板
文件读取(std::fstream文件,int-pos)
{
T数据;
read(reinterpret_cast(&data),sizeof(data));
返回数据;
}
并通过以下方式进行呼叫:

char x = FileRead<char>(file, pos);
charx=FileRead(文件,pos);

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

char value=FileRead<char>(file, pos);
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>();
}
模板
void函数_name()
{
//您可以使用T在此处访问您的类型
//您可以从T或任何您想要的东西创建对象
//例如:
T-obj;
//或:
T obj=新的T;
}
int main(){
函数名称();
}

我认为您不需要将其作为参数,而只需要作为返回值;您必须使用模板参数调用它。为了可读性,您可能希望添加'void'作为FileRead()的返回类型。我认为在这种情况下,不可默认构造的类型无论如何都不能被传递(至少在c++03中是这样),因为对于这些类型,它们无论如何都不是pod,对它们使用read将是UB(并且“const t”也不能修改)。如果您的编译器可以作为扩展名执行此操作,并且您希望使用非默认可构造类型,则可以改用此定义:模板T FileRead(std::fstream&file,int pos,T data=T()){file.read(reinterpret_cast(&data),sizeof(T));return data;},这与C::resize标准容器函数使用的技术相同。如果这是真的,RTTI就不存在了。
char x = FileRead<char>(file, pos);
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>();
}