Как взять имя типа в качестве параметра в функции? (C++)

Мне нужно иметь возможность передать имя типа в качестве параметра:

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, и я действительно не чувствую необходимости перепроектировать всю программу только из-за одной функции, так что есть ли возможность использовать имя типа в качестве параметра?

3 ответа

Решение

Чтобы использовать имя типа в качестве параметра, используйте шаблон.

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

Очень просто:

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

Я знаю, что на этот пост есть ответ, но все же у меня была проблема с этим, и я нашел простой способ ответов на этой странице. Вы можете передать имя типа любой функции следующим образом:

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

После компиляции вашей программы нет таких вещей, как типы. Это стиль C++.

Другие вопросы по тегам