Форум программистов, компьютерный форум CyberForum.ru

Приведение типов - C++

Восстановить пароль Регистрация
 
denis174
0 / 0 / 0
Регистрация: 14.02.2013
Сообщений: 6
14.02.2013, 16:01     Приведение типов #1
Уважаемые программеры, ПОМОГИТЕ!!!
Нужно (мне) реализовать шаблонную функцию для приведения типов.
Пример: newType_cast<T>(“123”);
где вместо T могут быть: int, double,std::string.

P.S. C++ изучаю 2-3 месяца, поэтому, если возможно, пишите проще.
Если есть готовая функция, буду очень благодарен, если нет, то хотя бы укажите направление
СПАСИБО!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.02.2013, 16:01     Приведение типов
Посмотрите здесь:

Приведение типов C++
C++ Приведение типов?
Приведение типов C++
Приведение типов C++
Приведение типов C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Dmitriy_M
1294 / 1175 / 104
Регистрация: 20.03.2009
Сообщений: 4,210
Записей в блоге: 11
14.02.2013, 16:05     Приведение типов #2
lexicak_cast
denis174
0 / 0 / 0
Регистрация: 14.02.2013
Сообщений: 6
14.02.2013, 16:17  [ТС]     Приведение типов #3
Dmitriy_M Спасибо )))))))))) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
denis174
0 / 0 / 0
Регистрация: 14.02.2013
Сообщений: 6
18.02.2013, 17:20  [ТС]     Приведение типов #4
Блин, еще вопрос!
Нужно (мне) реализовать шаблонную функцию для приведения типов.
Пример: newType_cast<T>(“123”);
где вместо T могут быть: int, double,std::string, char*.
Но сделать это так, чтобы при попытки приведения к char* компилятор в момент компиляции выдавал ошибку.
Может кто знает подскажет, ПОЖАЛУЙСТА!
Dmitriy_M
1294 / 1175 / 104
Регистрация: 20.03.2009
Сообщений: 4,210
Записей в блоге: 11
18.02.2013, 17:24     Приведение типов #5
Цитата Сообщение от denis174 Посмотреть сообщение
Но сделать это так, чтобы при попытки приведения к char* компилятор в момент компиляции выдавал ошибку.
Может кто знает подскажет, ПОЖАЛУЙСТА!
Частичная специализация шаблона.
denis174
0 / 0 / 0
Регистрация: 14.02.2013
Сообщений: 6
18.02.2013, 17:42  [ТС]     Приведение типов #6
Т.е, прописать явную специализацию для int, double и std::string, а для char* пропустить???
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
18.02.2013, 20:04     Приведение типов #7
Цитата Сообщение от denis174 Посмотреть сообщение
Т.е, прописать явную специализацию для int, double и std::string, а для char* пропустить???
Примерно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
#include <string>
 
#include <boost/lexical_cast.hpp>
 
 
template<typename TargetType, typename SourceType>
struct my_cool_cast_impl {
   
   static TargetType cast(SourceType const& source) {
      return boost::lexical_cast<TargetType>(source);
   }
};
 
template<typename SourceType>
struct my_cool_cast_impl<char *, SourceType>;
 
 
template<typename TargetType, typename SourceType>
TargetType my_cool_cast(SourceType const& source) {
   return my_cool_cast_impl<TargetType, SourceType>::cast(source);
}
 
 
int main() {
   std::cout << my_cool_cast<std::string>(123) << std::endl;
   std::cout << my_cool_cast<char *>(456) << std::endl;
}
http://liveworkspace.org/code/24h7JA

Добавлено через 1 минуту
Если есть static_assert, то всё проще:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <string>
#include <type_traits>
 
#include <boost/lexical_cast.hpp>
 
 
template<typename TargetType, typename SourceType>
TargetType my_cool_cast(SourceType const& source) {
   static_assert(!std::is_same<TargetType, char *>::value, "bad target type for a cast: char *");
   return boost::lexical_cast<TargetType>(source);
}
 
 
int main() {
   std::cout << my_cool_cast<std::string>(123) << std::endl;
   std::cout << my_cool_cast<char *>(456) << std::endl;
}
http://liveworkspace.org/code/24myKf
denis174
0 / 0 / 0
Регистрация: 14.02.2013
Сообщений: 6
18.02.2013, 21:01  [ТС]     Приведение типов #8
Dmitriy_M еще раз спасибо. Как Вы сказали, нужно через явную специализацию.
http://forum.codenet.ru/q57300/%D0%A...86%D0%B8%D0%B8

Добавлено через 16 минут
gray_fox, я еще не эксперт, поэтому скажите, в первом примере Вы реализовали приведение приведение boost::lexical_cast<TargetType>(source) для std::string, а для char * оставили "дыру" (как там правильно, не знаю )???
Во втором, насколько я понял, static_assert что-то типа if, где сравнивается char * с TargetType?
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
18.02.2013, 21:14     Приведение типов #9
Цитата Сообщение от denis174 Посмотреть сообщение
в первом примере Вы реализовали приведение приведение boost::lexical_cast<TargetType>(source) для std::string, а для char * оставили "дыру"
Ну да, для char * структура не определена и будет соответствующая ошибка при компиляции. Можно было бы проделать это напрямую с функциями без доп. структуры, если бы для функций была разрешена частичная специализация.
Цитата Сообщение от denis174 Посмотреть сообщение
Во втором, насколько я понял, static_assert что-то типа if, где сравнивается char * с TargetType?
Да, это "if времени компиляции", так можно проверять условия во время компиляции и выводить более-менее понятные сообщения об ошибках. Но это достаточно новая фича и может быть доступна не на каждом компиляторе.

Добавлено через 2 минуты
Цитата Сообщение от gray_fox Посмотреть сообщение
Вы реализовали приведение приведение boost::lexical_cast<TargetType>(source) для std::string
Точнее это реализация для любых типов, а потом специализация для char *.
denis174
0 / 0 / 0
Регистрация: 14.02.2013
Сообщений: 6
19.02.2013, 01:48  [ТС]     Приведение типов #10
Спасибо! Доступно и понятно
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.02.2013, 10:19     Приведение типов
Еще ссылки по теме:

Приведение типов C++
Приведение типов C++
Приведение типов C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Dmitriy_M
1294 / 1175 / 104
Регистрация: 20.03.2009
Сообщений: 4,210
Записей в блоге: 11
19.02.2013, 10:19     Приведение типов #11
Цитата Сообщение от gray_fox Посмотреть сообщение
Да, это "if времени компиляции", так можно проверять условия во время компиляции и выводить более-менее понятные сообщения об ошибках. Но это достаточно новая фича и может быть доступна не на каждом компиляторе.
Александреску это не мешало
Yandex
Объявления
19.02.2013, 10:19     Приведение типов
Ответ Создать тему
Опции темы

Текущее время: 02:23. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru