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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
denis174
0 / 0 / 0
Регистрация: 14.02.2013
Сообщений: 6
#1

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

14.02.2013, 16:01. Просмотров 746. Ответов 10
Метки нет (Все метки)

Уважаемые программеры, ПОМОГИТЕ!!!
Нужно (мне) реализовать шаблонную функцию для приведения типов.
Пример: newType_cast<T>(“123”);
где вместо T могут быть: int, double,std::string.

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

Приведение типов - C++
Необходимо привязать адрес массива double по указателю к адресу структуры. Массив сам создан в другом приложении. Если использовать...

Приведение типов - C++
Есть ли какая-нибудь разница в следующих выражениях: float a = 123.4f и float a = (float)123.4

Приведение типов. - C++
Столкнулся с задачей считывания данных из символьного массива с дальнейшим отбором из всего этого чисел и перезаписи их в массив типа...

Приведение типов - C++
При вводе с клавиатуры s = 11 и a = 1.1, получаем 9. Результат переменной d = 10, это правильно. В чём подвох? int main() { ...

Приведение типов - C++
Как привести наследника ко второму родителю? class Parent1 { public: int a; int b; int c; }; class Parent2

приведение типов - C++
Объясните, пожалуйста, почему возникает такая ошибка: error C2666: 'operator *' : 4 overloads have similar conversions ? Из-за того,...

10
Dmitriy_M
1357 / 1240 / 114
Регистрация: 20.03.2009
Сообщений: 4,442
Записей в блоге: 11
14.02.2013, 16:05 #2
lexicak_cast
1
denis174
0 / 0 / 0
Регистрация: 14.02.2013
Сообщений: 6
14.02.2013, 16:17  [ТС] #3
Dmitriy_M Спасибо )))))))))) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
0
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* компилятор в момент компиляции выдавал ошибку.
Может кто знает подскажет, ПОЖАЛУЙСТА!
0
Dmitriy_M
1357 / 1240 / 114
Регистрация: 20.03.2009
Сообщений: 4,442
Записей в блоге: 11
18.02.2013, 17:24 #5
Цитата Сообщение от denis174 Посмотреть сообщение
Но сделать это так, чтобы при попытки приведения к char* компилятор в момент компиляции выдавал ошибку.
Может кто знает подскажет, ПОЖАЛУЙСТА!
Частичная специализация шаблона.
1
denis174
0 / 0 / 0
Регистрация: 14.02.2013
Сообщений: 6
18.02.2013, 17:42  [ТС] #6
Т.е, прописать явную специализацию для int, double и std::string, а для char* пропустить???
0
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 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
0
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?
0
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 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 *.
1
denis174
0 / 0 / 0
Регистрация: 14.02.2013
Сообщений: 6
19.02.2013, 01:48  [ТС] #10
Спасибо! Доступно и понятно
0
Dmitriy_M
1357 / 1240 / 114
Регистрация: 20.03.2009
Сообщений: 4,442
Записей в блоге: 11
19.02.2013, 10:19 #11
Цитата Сообщение от gray_fox Посмотреть сообщение
Да, это "if времени компиляции", так можно проверять условия во время компиляции и выводить более-менее понятные сообщения об ошибках. Но это достаточно новая фича и может быть доступна не на каждом компиляторе.
Александреску это не мешало
0
19.02.2013, 10:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.02.2013, 10:19
Привет! Вот еще темы с ответами:

Приведение типов - C++
Как компилятор заставить адекватней приводить типы? (VS2012) Например: int a=-1; unsigned int b=5; if(a&gt;b){...}//Условие...

Приведение типов - C++
Делаю программу, которая кроме всего прочего должна отсортировать массив. Использую для этого qsort. Вот что получилось: ...

Приведение типов - C++
в GUI ни int str = static_convert&lt;int&gt;(Edit1-&gt;Text) ни int str = (int)Edit1-&gt;Text не приводит : E2034 Cannot convert...

Приведение типов - C++
Есть задача создать список с объектами у которых разные классы, но один базовый предок. Потом нужно перебрать список и если объект одного...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru