如何在函数中将类型名称作为参数传递?(C++)

3

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

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个回答

14

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

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

我认为你需要将T作为参数而不仅仅是返回值。 - Dan Olson
2
调用方式为 FileRead<char>(file, pos); - sth
你需要使用模板参数来调用它。http://www.codersource.net/cpp_function_template_overloading.html - Daniel A. White
为了提高可读性,您可能希望将“void”作为FileRead()的返回类型添加进去。 - JSBձոգչ
哎呀,如果你不指定类型的话,默认会被设置为 int 类型。这不仅仅是可读性的问题。 - 1800 INFORMATION
1
我认为在这种情况下,具有默认构造函数的类型无论如何都不能被传递(至少在c++03中),因为对于那些类型,它们本身就不是POD,使用read操作会导致未定义行为(而且“const T”也无法修改)。如果您的编译器可以作为扩展执行此操作,并且您想要使用非默认构造类型,则可以改用此定义:template<typename T> T FileRead(std::fstream &file, int pos, T data = T()) { file.read(reinterpret_cast<char*>(&data), sizeof(T)); return data; },这也是C::resize标准容器函数使用的相同技术。 - Johannes Schaub - litb

4
非常简单:
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);

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

应该是 T *obj = new T;new T 是一个指针)。 - Donald Duck

-3

当程序编译后,类型就不存在了。这是C ++的风格。


1
如果那是真的,RTTI 就不会存在了。 - RamblingMad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接