Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> динамический тип 
:(
    Опции темы
vinter
Дата 28.2.2007, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



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



--------------------
Мой блог
PM MAIL WWW   Вверх
Earnest
Дата 28.2.2007, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



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

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


--------------------
...
PM   Вверх
vinter
Дата 28.2.2007, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Earnest, спасибо, суть вроде уловил.


--------------------
Мой блог
PM MAIL WWW   Вверх
Rockie
Дата 1.3.2007, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



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




--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
vinter
Дата 1.3.2007, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



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

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

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


--------------------
Мой блог
PM MAIL WWW   Вверх
Rockie
Дата 1.3.2007, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



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

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

Динамическое формирование объектов
Эмуляция динамического объектно-ориентированного языка на С++


--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0461 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.