Форум программистов, компьютерный форум 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++ Работа с двумерными числовыми массивами. Использование указателей. Использование функций пользователя.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
04.08.2010, 23:00     Использование нововведений C++0x #21
Цитата Сообщение от Lavroff Посмотреть сообщение
А меня такой способ в 10 ВС посылает...
меня тоже посылает, видимо не допилили еще.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
04.08.2010, 23:03  [ТС]     Использование нововведений C++0x #22
Кстати это видимо тоже не полностью допилили

C++
1
2
3
4
template<class T1, class T2>
auto foo (T1 a, T2 b) -> decltype(a*b) {
  return (a * b);
}
Компилит, работает, но выделяет вызов функции в мейне красным и пишет внизу что типа ошибка) И тем не менее работает
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
04.08.2010, 23:06     Использование нововведений C++0x #23
Цитата Сообщение от Lavroff Посмотреть сообщение
Компилит, работает, но выделяет вызов функции в мейне красным и пишет внизу что типа ошибка) И тем не менее работает
да все впереди, тем более стандарт еще не принят.
мне вот еще очень понравилось наличие таких вещей как static_assert и nullptr.
neske
1419 / 786 / 55
Регистрация: 26.03.2010
Сообщений: 2,689
04.08.2010, 23:18     Использование нововведений C++0x #24
static_assert, тоже очень понравилось
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
04.08.2010, 23:44  [ТС]     Использование нововведений C++0x #25
Абсолютно не понял как использовать ссылку на временный объект (&&) и в каких случаях сие вообще возможно и нужно...
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
04.08.2010, 23:49     Использование нововведений C++0x #26
Lavroff, наиболее это необходимо для поверхностного копирования объекта, чтобы оптимизировать накладные расходы. rvalue references используются в основном конструкторами перемещения и присваиваниями перемещения. Подробнее здесь.
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
05.08.2010, 00:09     Использование нововведений C++0x #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, то временный объект копируется в другой временный объект, в итоге два копирования вместо одного.
как-то запутанно я описал все
и скорее всего я ошибаюсь, поправьте меня, пожалуйста.
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
05.08.2010, 00:24     Использование нововведений C++0x #28
Цитата Сообщение от fasked Посмотреть сообщение
видимо это позволяет избежать лишних копирований при создании новых временных объектов. таким образом перегружанная функция foo(string &&s) получает ссылку на объект, который был создан в функции bar(), если не перегружать функцию foo, то временный объект копируется в другой временный объект, в итоге два копирования вместо одного.
Да, по ходу, это второе применение rvalue references.
Цитата Сообщение от Бьярн Страуструп
Rvalue references can also be used to provide perfect forwarding.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
27.08.2010, 17:33  [ТС]     Использование нововведений C++0x #29
Написал две статьи по бытовому использованию С++0x:
Лямбда-функции
Авто и деклтайп

Может кому будет интересно)
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
27.08.2010, 17:41     Использование нововведений C++0x #30
Цитата Сообщение от fasked Посмотреть сообщение
но раньше такой код был невозможен
C++
1
void foo(const string &s)
Вот так работает.
niXman
Эксперт C++
 Аватар для niXman
3133 / 1445 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
27.08.2010, 18:28     Использование нововведений C++0x #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, ну так что с батареей? не поправишь?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
27.08.2010, 18:32  [ТС]     Использование нововведений C++0x #32
niXman, А в чем батарея не катит? Тут же описание исключительно лямбд, а не инициализации вектора без создания доп. массива
niXman
Эксперт C++
 Аватар для niXman
3133 / 1445 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
27.08.2010, 18:43     Использование нововведений C++0x #33
как-бы дело в том, что этот код, не совсем с++0х. это с++0х + Си
в с++0х контейнеры заполняются при инициализации так:
C++
1
std::vector<int> vec = {1,2,-1,-2,3,-3,4,-4,5,-5};
но это так, к сведению..
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
27.08.2010, 18:43  [ТС]     Использование нововведений C++0x #34
niXman, Да я это помнил. Просто вчера компиль начал ругаться на это по какой-то причине и я решил забить.
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
27.08.2010, 18:44     Использование нововведений C++0x #35
Lavroff, а разве компиляторы уже поддерживают такую инициализацию?
niXman
Эксперт C++
 Аватар для niXman
3133 / 1445 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
27.08.2010, 18:50     Использование нововведений C++0x #36
Nameless One, конечно. еще с ноября
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
27.08.2010, 18:51     Использование нововведений C++0x #37
Цитата Сообщение от Nameless One Посмотреть сообщение
Lavroff, а разве компиляторы уже поддерживают такую инициализацию?
gcc 4.5 поддерживает, VS2010 ругается.
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
27.08.2010, 18:52     Использование нововведений C++0x #38
fasked, теперь ясно, а то я вроде на msvs пробовал как-то, и не сканало...
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
27.08.2010, 21:32  [ТС]     Использование нововведений C++0x #39
fasked, Вот оно в чем дело. Тогда пробовал именно на VS
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.12.2010, 23:11     Использование нововведений C++0x
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
norge_goth
62 / 62 / 7
Регистрация: 27.01.2009
Сообщений: 279
07.12.2010, 23:11     Использование нововведений C++0x #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;
}
и в ком. строке выбило ошибки мол переменные без типов и т.д

Что я не так сделал? буду рад любой помощи
Yandex
Объявления
07.12.2010, 23:11     Использование нововведений C++0x
Ответ Создать тему
Опции темы

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