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

Использование нововведений C++0x - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 32, средняя оценка - 4.66
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
04.08.2010, 22:30     Использование нововведений C++0x #1
Красиво на самом деле... Вопрос, есть-ли резон использовать так, или новый стандарт стоит использовать в меру?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
 
template <typename T>
T Sum(T n, T m)
{
    return n+m;
}
 
int main()
{
    auto n=5.483, m=3.323;
    decltype(Sum(n,m)) sum=Sum(n,m);
    std::cout<<sum<<'\n';
    return 0;
}
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.08.2010, 22:30     Использование нововведений C++0x
Посмотрите здесь:

C++ Использование this.
Множественное наследование, Перегрузка функций, Перегрузка операторов, Использование дружественных функций и классов, Использование шаблонов классов C++
использование файла C++
C++ использование read
C++ Работа с двумерными числовыми массивами. Использование указателей. Использование функций пользователя.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
neske
1419 / 786 / 55
Регистрация: 26.03.2010
Сообщений: 2,693
04.08.2010, 22:31     Использование нововведений C++0x #2
auto? O_O
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
04.08.2010, 22:33  [ТС]     Использование нововведений C++0x #3
neske, Ну да.
C++0x предлагает способ для смягчения этой проблемы. В новом стандарте значение ключевого слова auto будет заменено. Если раньше auto означало, что переменная создается в стеке, и подразумевалось неявно в случае, если вы не указали что-либо другое (register, к примеру), то теперь это аналог var в C# 3.0. Тип переменной, объявленной как auto, определяется компилятором самостоятельно на основе того, чем эта переменная инициализируется.
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
04.08.2010, 22:37     Использование нововведений C++0x #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Lavroff Посмотреть сообщение
Вопрос, есть-ли резон использовать так, или новый стандарт стоит использовать в меру?
auto нужно использовать в основном в двух случаях:
1. Если тип переменной имеет очень большую длину и можно запутаться:
C++
1
std::map<std::string, std::vector<std::pair<int, std::vector<std::string>>>>::const_iterator it;
2. Если тип выражения заранее не известен:
C++
1
2
3
4
template<T1, T2>
void foo(T1 a, T2 b) {
  ??? c = a * b;
}
niXman
Эксперт C++
 Аватар для niXman
3133 / 1445 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
04.08.2010, 22:38     Использование нововведений C++0x #5
Цитата Сообщение от Lavroff Посмотреть сообщение
Вопрос, есть-ли резон использовать так, или новый стандарт стоит использовать в меру?
зависит от того, на какие компиляторы собираешься переносить код.
хотя, все топовые компиляторы с++ уже поддерживают с++0х, хоть и частично, обратной дороги нет. все равно всем придется допиливать свои компиляторы. иначе уйдут в лету
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
04.08.2010, 22:41     Использование нововведений C++0x #6
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
2. Если тип выражения заранее не известен:
там вроде такую фишку хотят продвинуть
C++
1
2
3
4
5
template <typename T1, typename T2>
[] (T1 a, T2 b) -> decltype(a + b)
{
   return a + b;
}
либо так
C++
1
2
3
4
5
template <typename T1, typename T2>
auto (T1 a, T2 b) -> decltype(a + b)
{
   return a + b;
}
niXman
Эксперт C++
 Аватар для niXman
3133 / 1445 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
04.08.2010, 22:44     Использование нововведений C++0x #7
Цитата Сообщение от fasked Посмотреть сообщение
там вроде такую фишку хотят продвинуть
эта "фишка" похожа на лямбда выражение.
пруфлинк пожалуйста.
neske
1419 / 786 / 55
Регистрация: 26.03.2010
Сообщений: 2,693
04.08.2010, 22:44     Использование нововведений C++0x #8
C++
1
2
3
4
template<T1, T2>
auto foo (T1 a, T2, b) {
  return (a * b);
}
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
04.08.2010, 22:45  [ТС]     Использование нововведений C++0x #9
CyBOSSeR, Да спасибо. Но все же, это нужно использовать. А есть-ли резон использовать там, где можно обойтись без, или же нет?

Добавлено через 22 секунды
neske, не-а.. так вот не покатит вроде. Онли для типов переменных, но не возвращаемого значения функции
Так что такой код выдает ошибку - 1>error C3551: требуется завершающий возвращаемый тип
neske
1419 / 786 / 55
Регистрация: 26.03.2010
Сообщений: 2,693
04.08.2010, 22:47     Использование нововведений C++0x #10
Покатит, http://habrahabr.ru/blogs/cpp/89494/

© fasked
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
04.08.2010, 22:48     Использование нововведений C++0x #11
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Если тип переменной имеет очень большую длину и можно запутаться:
например вот такой код отлично отрабатывает хотя пример не самый удачный.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
 
int main()
{
    std::vector<int> v;
    std::generate_n(std::back_inserter(v), 10, []{ return std::rand() % 9; });
 
    for(auto it = v.begin(); it != v.end(); ++it)
        std::cout << *it << " ";
 
    return 0;
}
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
04.08.2010, 22:48     Использование нововведений C++0x #12
Цитата Сообщение от fasked Посмотреть сообщение
там вроде такую фишку хотят продвинуть
Для возврата значения первый вариант предпочтительнее. Но если дело касается локальных переменных auto очень в тему.
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
04.08.2010, 22:50     Использование нововведений C++0x #13
Цитата Сообщение от niXman Посмотреть сообщение
эта "фишка" похожа на лямбда выражение.
в первом случае да, порождается лямбда, в которой возвращаемый тип тоже автоматически генерируется, если в ней существует тольки один return. во втором, который я чуть позже добавил используется как раз auto.
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
04.08.2010, 22:50     Использование нововведений C++0x #14
Цитата Сообщение от niXman Посмотреть сообщение
пруфлинк пожалуйста
Тут FAQ от Бъярна Страуструпа по C++0x. Про код, приведенный fasked конкретно здесь.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
04.08.2010, 22:53  [ТС]     Использование нововведений C++0x #15
C++
1
2
3
4
template<class T1, class T2>
auto foo (T1 a, T2 b) {
  return (a * b);
}
Хм. У меня сие выдает ошибку типа функции.
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
04.08.2010, 22:55     Использование нововведений C++0x #16
Цитата Сообщение от Lavroff Посмотреть сообщение
Хм. У меня сие выдает ошибку типа функции.
ты забыл decltype.
C++
1
2
3
4
template<class T1, class T2>
auto foo (T1 a, T2 b) -> decltype(a*b) {
  return (a * b);
}
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
04.08.2010, 22:57     Использование нововведений C++0x #17
fasked, только auto здесь лишнее:
C++
1
2
3
4
template<class T1, class T2>
[] foo (T1 a, T2 b) -> decltype(a*b) {
  return (a * b);
}
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
04.08.2010, 22:57  [ТС]     Использование нововведений C++0x #18
fasked, Ну я про код neske говорил. А вот с decltype работает) Спасибо, интересно
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
04.08.2010, 22:58     Использование нововведений C++0x #19
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
только auto здесь лишнее
с auto тоже работает, два способа
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.08.2010, 22:59     Использование нововведений C++0x
Еще ссылки по теме:

C/C++ Использование функций, использование break C++
Использование строк.Использование структур C++
C++ Использование классов

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

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
04.08.2010, 22:59  [ТС]     Использование нововведений C++0x #20
CyBOSSeR, А меня такой способ в 10 ВС посылает...
Yandex
Объявления
04.08.2010, 22:59     Использование нововведений C++0x
Ответ Создать тему
Опции темы

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