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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Шаблоны функций 
V
    Опции темы
vlarry
Дата 3.9.2011, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 16.8.2009

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



Доброе утро, форумчане! У меня есть контейнер 
Код

map<string, map<string, string>>
. Мне надо в функции возвращать значение из мапа, но это может быть как число, так и строка...сделал шаблон функции
Код

template<class Type>
bool getValue(Type &value, string nameSection, string nameKey)
{
        string tvalue = typeVal(sections[nameSection][nameKey];
        if(typeValue == isString)       // typeValue - это самописная функция для определения строка или число
                value = tvalue;
        else
                value = atoi(tvalue.c_str());
}


если я передаю ссылку на int, то пишет, что не может преобразовать string в int и наоборот. Как мне вернуть значение?

Это сообщение отредактировал(а) vlarry - 3.9.2011, 09:28
PM MAIL   Вверх
newbee
Дата 3.9.2011, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


Профиль
Группа: Участник
Сообщений: 703
Регистрация: 24.8.2011

Репутация: 4
Всего: 19



Шаблон не поможет, потому что typeValue == isString вычисляется во время выполнения программы, когда шаблоны уже не работают. Если уверен, что нужен такой изврат, можно поступить следующим способом:
Код

bool getValue(int &ivalue, string &svalue, string nameSection, string nameKey)
{
        string tvalue = typeVal(sections[nameSection][nameKey];
        if(typeValue == isString){
                svalue = tvalue;
                return true;}
        else{
                ivalue = atoi(tvalue.c_str());
                return false;}
}

Или объединить возвращаемое значение в union.


--------------------
You're face to face
With man who sold the world
PM   Вверх
vlarry
Дата 3.9.2011, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 16.8.2009

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



спасибо, а с помощью указателя на void* не получиться возвратить?Или это уже полное извращениеsmile
PM MAIL   Вверх
mes
Дата 3.9.2011, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



vlarry, посмотрите в сторону variant..


--------------------
PM MAIL WWW   Вверх
newbee
Дата 3.9.2011, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


Профиль
Группа: Участник
Сообщений: 703
Регистрация: 24.8.2011

Репутация: 4
Всего: 19



Получится так:
Код

struct ret{
 enum {i, s} type;
 union v{
  int i;
  string *s;
 };
};

struct ret getValue(string nameSection, string nameKey)
{
        struct ret ret;
        string tvalue = typeVal(sections[nameSection][nameKey];
        if(typeValue == isString){
                ret.type=ret::s;
                ret.v.s=new string(tvalue);}
        else{
                ret.type=ret::i;
                ret.v.i=atoi(tvalue.c_str());}
        return ret;
}



--------------------
You're face to face
With man who sold the world
PM   Вверх
mes
Дата 3.9.2011, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(newbee @  3.9.2011,  09:02 Найти цитируемый пост)
  string *s;
...
ret.v.s=new string(tvalue);}

newbee, а зачем себе проблемы искать с указателями, когда у тс С++ а  не С ?


Это сообщение отредактировал(а) mes - 3.9.2011, 10:07


--------------------
PM MAIL WWW   Вверх
vlarry
Дата 3.9.2011, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 16.8.2009

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



спасибо, попробую
PM MAIL   Вверх
volatile
Дата 3.9.2011, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 37
Всего: 85



Цитата(vlarry @  3.9.2011,  09:28 Найти цитируемый пост)
 if(typeValue == isString)       // typeValue - это самописная функция для определения строка или число

Офигенный комментарий...
Зачем вы сравниваете саму функцию (фактически здесь указатель на функцию typeValue), с isString ?
И что такое isString  ?

PM MAIL   Вверх
mes
Дата 3.9.2011, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(volatile @  3.9.2011,  09:17 Найти цитируемый пост)
Зачем вы сравниваете саму функцию 

полагаю, что это всего лишь опечатка   smile 


--------------------
PM MAIL WWW   Вверх
Result
Дата 3.9.2011, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 15.5.2011

Репутация: 2
Всего: 5



Код

template<class Type>
bool getValue(Type &value, string nameSection, string nameKey)
{
        string tvalue = typeVal(sections[nameSection][nameKey]);
        stringstream strSteram;
        strStream << tvalue;
        strStream >> value;
}

Вот как-то так думается. 

Это у Вас парсер инишек?

PM   Вверх
newbee
Дата 3.9.2011, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


Профиль
Группа: Участник
Сообщений: 703
Регистрация: 24.8.2011

Репутация: 4
Всего: 19



Цитата(mes @  3.9.2011,  11:07 Найти цитируемый пост)
newbee, а зачем себе проблемы искать с указателями, когда у тс С++ а  не С ?
Ну это самый простой набросок variant-а, предложенного тобой. Когда я начинала писать ответ, твоего комментария еще не было, отвечать сухо "попробуй variant" не хотела, ОП мог его просто не понять, а городить более правильный С++-сный variant не было времени. В общем, я только задумку показала.


--------------------
You're face to face
With man who sold the world
PM   Вверх
vlarry
Дата 3.9.2011, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 16.8.2009

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



спасибо, пока отсутствовал и не смог ответить...
да это парсер инишек...

Добавлено через 10 минут и 57 секунд
Цитата(Result @ 3.9.2011,  10:46)
Код

template<class Type>
bool getValue(Type &value, string nameSection, string nameKey)
{
        string tvalue = typeVal(sections[nameSection][nameKey]);
        stringstream strSteram;
        strStream << tvalue;
        strStream >> value;
}

Вот как-то так думается. 

Это у Вас парсер инишек?

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

Добавлено через 11 минут и 32 секунды
 smile 
PM MAIL   Вверх
mes
Дата 3.9.2011, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(newbee @  3.9.2011,  11:12 Найти цитируемый пост)
Ну это самый простой набросок variant-а, предложенного тобой. Когда я начинала писать ответ, твоего комментария еще не было, отвечать сухо "попробуй variant" не хотела, ОП мог его просто не понять, а городить более правильный С++-сный variant не было времени. В общем, я только задумку показала. 

просто без звездочки у string и new в присвоении было б и короче , и ясней, и безопасней..
но, как говорится, на скорую руку не придираются..  smile 

Это сообщение отредактировал(а) mes - 3.9.2011, 14:01


--------------------
PM MAIL WWW   Вверх
volatile
Дата 3.9.2011, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 37
Всего: 85



с stringstream  конечно хорошо, но где возвращаемое значение ?

Здесь имхо, просто шаблонная ф-я не нужна вовсе.
Решается 2-мя простыми перегруженными функциями (и без привлечения потоков).

Код

bool getValue(string & value, string nameSection, string nameKey)
{
        value = sections[nameSection][nameKey];
        return false;
}

bool getValue(int & value, string nameSection, string nameKey)
{
        value = atoi(sections[nameSection][nameKey].c_str());
        return true;
}

 smile 

Это сообщение отредактировал(а) volatile - 3.9.2011, 16:14
PM MAIL   Вверх
Result
Дата 3.9.2011, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 15.5.2011

Репутация: 2
Всего: 5



Цитата(volatile @ 3.9.2011,  16:09)
 но где возвращаемое значение ?

подозреваю что возвращаемое значение не зависит от типа входного параметра, скорее от значения из мапа. 
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.0902 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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