Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/33: Рейтинг темы: голосов - 33, средняя оценка - 5.00
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
1

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

04.08.2010, 22:30. Показов 6481. Ответов 60
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Красиво на самом деле... Вопрос, есть-ли резон использовать так, или новый стандарт стоит использовать в меру?

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;
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.08.2010, 22:30
Ответы с готовыми решениями:

Использование расширений формы и иных нововведений в 1С
Добрый день, уважаемые форумчане. Имеется задача - создать собственное тиражируемое решение на...

Одно из нововведений в .net 4.5 - portable class libraries: что это
Одно из нововведений в .net 4.5 - portable class libraries....

Придумать сложное задание для Java 8 с использованием нововведений языка
Знакомый попросил дать какое-нибудь серьезное задание на java 8, чтобы он смог использовать там все...

Работа с двумерными числовыми массивами. Использование указателей. Использование функций пользователя.
Помогите пожалуйста!!!!!!! Сделать три варианта: первый вариант – передача данных между...

60
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
04.08.2010, 23:00 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от Lavroff Посмотреть сообщение
А меня такой способ в 10 ВС посылает...
меня тоже посылает, видимо не допилили еще.
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
04.08.2010, 23:03  [ТС] 22
Кстати это видимо тоже не полностью допилили

C++
1
2
3
4
template<class T1, class T2>
auto foo (T1 a, T2 b) -> decltype(a*b) {
  return (a * b);
}
Компилит, работает, но выделяет вызов функции в мейне красным и пишет внизу что типа ошибка) И тем не менее работает
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
04.08.2010, 23:06 23
Цитата Сообщение от Lavroff Посмотреть сообщение
Компилит, работает, но выделяет вызов функции в мейне красным и пишет внизу что типа ошибка) И тем не менее работает
да все впереди, тем более стандарт еще не принят.
мне вот еще очень понравилось наличие таких вещей как static_assert и nullptr.
0
1552 / 918 / 193
Регистрация: 26.03.2010
Сообщений: 3,105
04.08.2010, 23:18 24
static_assert, тоже очень понравилось
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
04.08.2010, 23:44  [ТС] 25
Абсолютно не понял как использовать ссылку на временный объект (&&) и в каких случаях сие вообще возможно и нужно...
0
Эксперт С++
2347 / 1720 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
04.08.2010, 23:49 26
Lavroff, наиболее это необходимо для поверхностного копирования объекта, чтобы оптимизировать накладные расходы. rvalue references используются в основном конструкторами перемещения и присваиваниями перемещения. Подробнее здесь.
1
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
05.08.2010, 00:09 27
не знаю насколько это по теме, но раньше такой код был невозможен:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <string>
 
using namespace std;
 
void foo(string &s)
{
    cout << s << endl;
}
 
string bar()
{
    return "string";
}
 
int main()
{
    foo(bar());
 
    system("PAUSE");
    return 0;
}
Код
error: invalid initialization of non-const reference of type 'std::string&' from a temporary of type 'std::string'
по новому стандарту проходит. при чем, если добавить еще одну функцию.
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
#include <iostream>
#include <string>
 
using namespace std;
 
void foo(string &s)
{
    cout << s << endl;
}
 
void foo(string &&s)
{
    cout << "&&" << s << endl;
}
 
string bar()
{
    return "string";
}
 
int main()
{
    foo(bar());
 
    system("PAUSE");
    return 0;
}
то срабатывает именно вторая. со ссылкой на временной объект.
видимо это позволяет избежать лишних копирований при создании новых временных объектов. таким образом перегружанная функция foo(string &&s) получает ссылку на объект, который был создан в функции bar(), если не перегружать функцию foo, то временный объект копируется в другой временный объект, в итоге два копирования вместо одного.
как-то запутанно я описал все
и скорее всего я ошибаюсь, поправьте меня, пожалуйста.
1
Эксперт С++
2347 / 1720 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
05.08.2010, 00:24 28
Цитата Сообщение от fasked Посмотреть сообщение
видимо это позволяет избежать лишних копирований при создании новых временных объектов. таким образом перегружанная функция foo(string &&s) получает ссылку на объект, который был создан в функции bar(), если не перегружать функцию foo, то временный объект копируется в другой временный объект, в итоге два копирования вместо одного.
Да, по ходу, это второе применение rvalue references.
Цитата Сообщение от Бьярн Страуструп
Rvalue references can also be used to provide perfect forwarding.
1
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
27.08.2010, 17:33  [ТС] 29
Написал две статьи по бытовому использованию С++0x:
Лямбда-функции
Авто и деклтайп

Может кому будет интересно)
1
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
27.08.2010, 17:41 30
Цитата Сообщение от fasked Посмотреть сообщение
но раньше такой код был невозможен
C++
1
void foo(const string &s)
Вот так работает.
0
Эксперт С++
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
27.08.2010, 18:28 31
Цитата Сообщение от Lavroff Посмотреть сообщение
Написал две статьи по бытовому использованию С++0x:
Лямбда-функции
Авто и деклтайп

Может кому будет интересно)
первое:
C++
1
2
    int Arr[] = {1,2,-1,-2,3,-3,4,-4,5,-5}; 
    std::vector<int> Vec(Arr, Arr+sizeof Arr/sizeof(Arr[0]));
это что за батарея?

второе:
C++
1
[&Sum, &Mult, &Sub](int Elem) {Sum+=Elem; Mult*=Elem; Sub-=Elem;}
в этом нет смысла. каптурь все.

Добавлено через 38 минут
Lavroff, ну так что с батареей? не поправишь?
1
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
27.08.2010, 18:32  [ТС] 32
niXman, А в чем батарея не катит? Тут же описание исключительно лямбд, а не инициализации вектора без создания доп. массива
0
Эксперт С++
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
27.08.2010, 18:43 33
как-бы дело в том, что этот код, не совсем с++0х. это с++0х + Си
в с++0х контейнеры заполняются при инициализации так:
C++
1
std::vector<int> vec = {1,2,-1,-2,3,-3,4,-4,5,-5};
но это так, к сведению..
1
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
27.08.2010, 18:43  [ТС] 34
niXman, Да я это помнил. Просто вчера компиль начал ругаться на это по какой-то причине и я решил забить.
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
27.08.2010, 18:44 35
Lavroff, а разве компиляторы уже поддерживают такую инициализацию?
0
Эксперт С++
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
27.08.2010, 18:50 36
Nameless One, конечно. еще с ноября
1
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
27.08.2010, 18:51 37
Цитата Сообщение от Nameless One Посмотреть сообщение
Lavroff, а разве компиляторы уже поддерживают такую инициализацию?
gcc 4.5 поддерживает, VS2010 ругается.
2
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
27.08.2010, 18:52 38
fasked, теперь ясно, а то я вроде на msvs пробовал как-то, и не сканало...
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
27.08.2010, 21:32  [ТС] 39
fasked, Вот оно в чем дело. Тогда пробовал именно на VS
0
62 / 62 / 13
Регистрация: 27.01.2009
Сообщений: 279
07.12.2010, 23:11 40
Народ, подскажите пожалуйста

захотел поюзать нововведения C+0x(то что реализовано), на сайте указано что в gcc4.5 лямбда ф-ции и auto-переменные уже реализованы, скачал и установил mingw4.5

в mingw4.5 цифры 4.5 указывают на версию gcc? то есть там компилятор версии gcc4.5?

Далее добавил переменную в окружение C:\MinGW\bin
попробовал скомпилить пример:
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;
}
и в ком. строке выбило ошибки мол переменные без типов и т.д

Что я не так сделал? буду рад любой помощи
0
07.12.2010, 23:11
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.12.2010, 23:11
Помогаю со студенческими работами здесь

Создание и использование своих @NamedQueries. Использование EntityManager
Добрый день! Создавал классы сущностей и сессий через NetBeans генераторы кода. Использование...

Задачи на использование событий. Осуществить использование событий в программе с применением синтаксиса обработчика, рекомендованного для среды NET Fr
NET Framework. Программа для поиска простых чисел среди чисел Фибоначчи. При нахождении...

Использование строк.Использование структур
Задачка: Дана строка,состоящая из групп нулей и едениц. Найти и вывести на экран группы с нечетным...

Использование функций, использование break
Здравствуйте. Не знал как назвать тему, боялся что, если назову &quot;КАК ЭТО РАБОТАЕТ?&quot; то её удалят....


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru