Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > динамический тип


Автор: vinter 28.2.2007, 19:19
блин не знал как тему назвать, вот и назвал такsmile
мне нужно сделать следующее: считать из файла тип допустим int, без разницы как , в результате у меня будет известность о считанном типа, и его имя через typeid.
вопрос как нибудь вообще можно, сделать следующее s<name> s;, где name имя типа..

Автор: Earnest 28.2.2007, 19:46
Чтобы считать объект из файла, нужно сначала знать его тип. Стандартный подход - записывать перед значением <нечто>, идентифицирующее тип. Соответственно, сначала считывать это нечто, создавать (динамически) объект нужного типа, затем уже читать. Поскольку сделать new <не знаю что> никак не удастся, различные фабрики рулят: В данном случае фабрика - это объект, который  умеет создавать объект нужного типа по переданному <нечто>. 
Самый простой подход: <нечто> = type_info::raw_name, фабрика внутри себя имеет raw_name -> функция создания объекта.

Но, это, естественно тольеко для пользовательских типов. Для встроенных - слишком жирно будет. Но принцип тот же.

Автор: vinter 28.2.2007, 20:08
Earnest, спасибо, суть вроде уловил.

Автор: Rockie 1.3.2007, 12:59
vinter, тип в конечном итоге все равно знаешь только ты. Можно сделать проверку к примеру таким образом:
Код

#include <iostream>
#include <fstream>

using namespace std;

int main()
{
    ifstream f("text.txt");

    double dNum = 0;
    int iNum = 0;
    char cLetter = ' ';

    if(f>>dNum) cout<<dNum<<" has type double"<<'\n';
    
    f.clear();     // сброс буфера и на начало файла
    f.seekg(0);

    if(f>>iNum) cout<<iNum<<" has type int"<<'\n';

    f.clear();    
    f.seekg(0);

    if(f>>cLetter) cout<<cLetter<<" has type char"<<'\n';

    return 0;
}


То есть осуществлять форматный ввод в одну переменную, потом в другую. Но если для 

содержимое файла text.txt:
Цитата
a


ты получишь ответ 
Цитата
a has type char


то для 
содержимое файла text.txt:
Цитата
12

будет
Цитата
12 has type double
12 has type int
1 has type char

Почему? Потомучто 12 может быть и int, и double, и short


Автор: vinter 1.3.2007, 13:28
Rockie, это то понятно, я не мог прикрутить, это к созданию шаблона с нужным мне типом, просто если так использовать if, то за пределами его я теряю свой обьект..
Цитата

Почему? Потомучто 12 может быть и int, и double, и short

это худо бедно решается применением typeid(12).name() - получишь "int"

Автор: Rockie 1.3.2007, 14:26
Цитата(vinter @  1.3.2007,  13:28 Найти цитируемый пост)
это худо бедно решается применением typeid(12).name() - получишь "int"

vinter, это уже от обратного, тут 12 ты уже как-то получил. Но даже пусть так, а если 12 - это значение переменной типа double? А если long double? Компилятор не знает тип, пока ты ему не скажешь, int это просто default.

http://www.softcraft.ru/coding/dfo.shtml
http://www.softcraft.ru/coding/dynemu/dynemu.shtml

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)