LINUX.ORG.RU

почитай ещё раз про decltype и про auto.

Подумай, какой тип выведет auto и decltype(auto) если будешь возвращать ссылку…

anonymous
()

Ну например вот:


#include <iostream>
#include <vector>

using namespace std;

int main() {
  auto i = 5;
  vector<decltype(i)> vi;
  
  auto d = 5.0;
  vector<decltype (d)> vd;
}

rumgot ★★★★★
()

Почитайте https://ravesli.com/urok-62-klyuchevoe-slovo-auto-vyvod-tipov/ Урок №62. Вывод типов: ключевое слово auto

Предпочитаю явно указывать тип.
И более того, указывать типы аргументом при вызове функций.
ИМХО в этом случае код более readable.

Для обобщенного программирования конечно иной подход …

anonymous
()
Ответ на: комментарий от anonymous

Почитайте https://ravesli.com/urok-62-klyuchevoe-slovo-auto-vyvod-tipov/ Урок №62. Вывод типов: ключевое слово auto

Забавно, учитывая то, сколько я прочел литературы по C++, чтобы читать заметки, информация в которых взята по большей части из той же литературы.

Предпочитаю явно указывать тип.

Это убеждение имеет право на существование, но иногда удобнее все же обобщить, чтобы при смене типа некоторой переменной типы переменных, которые зависят от данной, были определены автоматически.

Кроме этого, я привел примитивный пример, чтобы указать случай использования decltype и не загромождать код другими синтаксическими конструкциями. Конечно же такое используется в шаблонах или обобщенных лямбда выражениях (собственно тоже шаблоны) в большей степени чем в простых функциях.

И более того, указывать типы аргументом при вызове функций.

Я так понимаю, что не при вызове, а при объявлении/реализации

ИМХО в этом случае код более readable.

В этом примитивном случае - ДА. Но когда в качестве главного приоритета ставится автоматический вывод типа, читабельностью можно пожертвовать.

rumgot ★★★★★
()
Ответ на: комментарий от rumgot

Я так понимаю, что не при вызове, а при объявлении/реализации

Нет, именно при вызове.
Мне так удобней, кому-то иначе … /не принципиально/.

Если не обобщенный алгоритм, то зачем auto?
Стиль разработки алгоритмов разными программистами весьма разный.
Интересно все же, что дает auto не в обобщенном алгоритме?

anonymous
()
Ответ на: комментарий от anonymous

Небось ещё и венгерскую нотацию используешь при именовании переменных и т.п.? Билли будет тобой доволен. Просись в команду индусов разработчиков WinAPI.

ox55ff ★★★★★
()
Ответ на: комментарий от ox55ff

Небось ещё и венгерскую нотацию используешь при именовании переменных и т.п.? Билли будет тобой доволен. Просись в команду индусов разработчиков WinAPI.

Что считаю целесообразным, то использую.
И ваши советы примените к себе.

anonymous
()

1. decltype появился в спп раньше чем auto.

2.

#include <cstdio>

template <typename T>
struct M {
  // T t; // assume we need t as member
  M(T t) {puts("ctor 1");}
  M() {puts("ctor 2");}
};

template <typename T>
M<T> ctor1(T t) {return M<T> (t);}

template <typename T>
M<T> ctor2() {return M<T> ();}

bool g_context_call_ctor1 = true;

template <typename F, typename T>
auto g(F f, T t) {
  if (g_context_call_ctor1) {
    return ctor1(f(t));
  } else {
    return ctor2<decltype(f(t))> ();
  }
}

int main() {
  auto f = [] (int x) {printf("%d\n", x); return x;};
  g(f, 23);
  g_context_call_ctor1 = false;
  g(f, 23);
}

anonymous
()
Ответ на: комментарий от anonymous

И более того, указывать типы аргументом при вызове функций.

«Указывать типы аргументом при вызове функций» - не очень ясен этот пассаж. Точнее ясен, но нет уверенности в том, что именно это ты имеешь ввиду. Можешь пояснить с примером?

rumgot ★★★★★
()

Я б ещё спросил, на кой чёрт вот здесь «typename»:

template<class K, class V> void myFunc(..., function<bool(typename std::unordered_map<K,V>::iterator)> myCallback) { ... }
dimgel ★★★★★
()
Ответ на: комментарий от rumgot

«Указывать типы аргументом при вызове функций» - не очень ясен этот пассаж.

     cntLine = SkipChar(
      (ParsingStruct_ *) pParsingStruct,
      (CHAR            ) ',',
      (INT             ) cntBraces,
      (INT             ) flObjectBraces
     );
anonymous
()
Ответ на: комментарий от dimgel

Здесь нужно указать для компилятора, что

std::unordered_map<K,V>::iterator

это именно тип, а не член.

В общем случае это ключевое слово, помимо его прямого назначения, должно использоваться везде, где есть обращение к типу, который зависит от типового аргумента шаблона (в данном случае K и V).

rumgot ★★★★★
()
Ответ на: комментарий от anonymous

Ая-яяяя-яй. Боже ты мой милый :-)

Тут ты не указываешь типы, ты выполняешь операцию приведения в стиле C к указанному в скобках типу.

rumgot ★★★★★
()
Ответ на: комментарий от rumgot

это именно тип, а не член.

Недопонял. А сам компилятор что, не в состоянии разобраться? Или там два объявления – один тип, другой поле? Чёт не верится.

dimgel ★★★★★
()
Последнее исправление: dimgel (всего исправлений: 1)
Ответ на: комментарий от rumgot

Тут ты не указываешь типы, ты выполняешь операцию приведения в стиле C к указанному в скобках типу.

Ни какого приведения в данном примере не делается.
Аргументы и так имеют тип, который указан в декларации функции …

anonymous
()
Ответ на: комментарий от anonymous

Если не обобщенный алгоритм, то зачем auto?

Уменьшить количество ошибок. Например, многие ли задумываются, какой тип возвращает strlen? Многие ли пишут:

int l = std::strlen(something);

?

Интересно все же, что дает auto не в обобщенном алгоритме?

Иногда это дает гибкость. Например, было такое:

class some_my_type {
public:
  first_type method() {...};
  ...
};
...
some_my_type obj;
const auto r = obj.method();
...
auto r2 = obj.method();
if( r != r2 ) ...

затем стало такое:

class some_my_type {
public:
  second_type method() {...};
  ...
};

При этом код, использующий some_my_type не поменялся.

Ну и это мы еще не говорим про типы с зубодробительными именами (включая вложенные типы). И не берем во внимание, скажем, structured binding из C++17.

eao197 ★★★★★
()
Ответ на: комментарий от dimgel

Получается, что нет. Чтобы почитать более развернутое описание этого случая, обратись к книге Шаблоны C++ Справочник Разработчика 2-e издание Вандевурд Джусаттис Грегор - Глава 5.1

rumgot ★★★★★
()
Ответ на: комментарий от anonymous

Да, скорее всего на этапе оптимизации эти операции будут удалены, но это именно операции приведения. И проблема данного кода в том, что если твои переменные имеют другой тип, то они будут приведены к указанному в скобках и не будет ошибки компиляции. Т.е. это потенциально приводит к ошибкам. Т.е. те потенциальные ошибки, которые мог бы обнаружить компилятор, теперь не будут обнаружены.

rumgot ★★★★★
()
Последнее исправление: rumgot (всего исправлений: 1)
Ответ на: комментарий от anonymous

Если не обобщенный алгоритм, то зачем auto?

auto& x = LongDescriptiveSingletonName::get();
dimgel ★★★★★
()
Ответ на: комментарий от dimgel

Я вот тоже не люблю всякие такие заковыристые особенности, каких тут вагон и маленькая тележка. Но прости, а что же не говно?

rumgot ★★★★★
()
Ответ на: комментарий от dimgel

Говно собачье это ваш сиплюсплюс.

Это еще ничего, нормальные компиляторы сами подсказывают когда typename пропустил. А вот сюрпризы с uniform initialization syntax, например, воняют гораздо сильнее.

eao197 ★★★★★
()
Ответ на: комментарий от eao197

нормальные компиляторы сами подсказывают когда typename пропустил.

Т.е. они-таки в состоянии разобраться.

dimgel ★★★★★
()
Ответ на: комментарий от dimgel

Т.е. они-таки в состоянии разобраться.

В состоянии указать, что им чего-то не хватает :)

eao197 ★★★★★
()
Ответ на: комментарий от anonymous
cntLine = SkipChar(
      (ParsingStruct_ *) pParsingStruct,
      (CHAR            ) ',',
      (INT             ) cntBraces,
      (INT             ) flObjectBraces
     );

не пиши так НИКОГДА. во- первых это вообще не нужно. а во-вторых опасно, если ты случайно преобразуешь ссылку на короткий тип, в ссылку на длинный. тогда тебе распишут память.

ты можешь не заметить, что функция берет ссылку, а не значение.

alysnix ★★★
()
Ответ на: комментарий от anonymous

Боже, какой говнокод!

Абсолютно не приспособленный к рефакторингу и по сути во многом отменяющий статическую типизацию. Теперь при смене типа переменной компилятор тебе не укажет на ошибки ибо у тебя принудительный каст.

Если нравится такой дрочь, то пиши типы в комментарии.

ox55ff ★★★★★
()
Ответ на: комментарий от Siborgium

Это же Владимир, он примерно этим и занимается

Да, Владимир.
Разработку API веду в Visual Studio и НИ КАКОГО Win API не использую.

Басни не придумывайте ...

Вот такие злопыхатели наговаривают и придумывают всякие небылицы. Да и всякие нехорошие посты пару лет не от меня были.

anonymous
()
Ответ на: комментарий от ox55ff

Абсолютно не приспособленный к рефакторингу …

Выдумщик вы однако.
Non problem с рефакторингом.

anonymous
()
Ответ на: комментарий от anonymous

Да и всякие нехорошие посты пару лет не от меня были.

Поверь, самые худшие посты про себя ты написал сам.

LamerOk ★★★★★
()
Ответ на: комментарий от alysnix

… ты можешь не заметить, что функция берет ссылку, а не значение.

Вы отбросили контекст того, что использую в run-time метаданные об объектах.
И ни какой забывчивости в API не предусмотрено.
Кстати API эффективно и совершенствуется …

anonymous
()
Ответ на: комментарий от LamerOk

А я - нет. Я про тебя самые худшие посты пока ещё не написал. Но подмывает.

И не подмоет потому, что на личности в постах ни когда не перехожу …

Взять например этот тред.
Некоторые перешли на личности и этого

ни кто не замечает
anonymous
()
Ответ на: комментарий от anonymous

Считай это комплиментом. Можно сказать, что ты настолько яркая личность, что переход на тебя рассматривается как обсуждение общественно-значимого вопроса.

LamerOk ★★★★★
()
Ответ на: комментарий от alysnix

… ты можешь не заметить, что функция берет ссылку, а не значение.

Кстати да, пример не удачен …

anonymous
()
Ответ на: комментарий от anonymous

что использую в run-time метаданные об объектах.

в типизированном языке явное преобразование типа есть необходимое зло, и если оно применяется - это указывает на то, что либо типы написаны неверно, либо тут какие-то особенно низкоуровневые приколы. первый случай надо править, второй - вразумительно комментировать.

идеальная программа вообще не должна содержать таких преобразований, ну если только не случай низкого уровня и потенциальной непереносимости.

alysnix ★★★
()
Ответ на: комментарий от LamerOk

Можно сказать, что ты настолько яркая личность, что переход на тебя рассматривается как обсуждение общественно-значимого вопроса.

Дружище, пару лет меня троллил один из форумчан и ОЧЕНЬ УСПЕШНО.
Везде он подписывался Владимир и публиковал всякие гнусные посты.
У меня ни одного гнусного поста и оскорблений кого-то НЕТ!
Что до суждений в постах, то

Сто программистов, СТО МНЕНИЙ!
anonymous
()
Ответ на: комментарий от alysnix

в типизированном языке явное преобразование типа есть необходимое зло, и если оно применяется - это указывает на то, что либо типы написаны неверно, либо тут какие-то особенно низкоуровневые приколы. первый случай надо править, второй - вразумительно комментировать.

Согласен.
Но в приведенном коде нет ни какого приведения.
Просто для readable, указываю типы аргументом, такие же как в декларации функций.

И не более того ...
anonymous
()
Ответ на: комментарий от dimgel

Всё говно. :(

  • Отрицание
  • Гнев
  • Торг
  • Депрессия
  • Принятие
anonymous
()
Ответ на: комментарий от LamerOk

Я боюсь, ты недооцениваешь общественную значимость своей персоналии.

Ни какой значимости во мне нет.
Но хамовитым иногда напоминаю …

anonymous
()
Ответ на: комментарий от dimgel

Сложно, да. Не пытайся больше, другие смогут.

anonymous
()
Ответ на: комментарий от alysnix

идеальная программа вообще не должна содержать таких преобразований, ну если только не случай низкого уровня и потенциальной непереносимости.

У меня API считает слово «компилятор» неприличным.
В run-time парсится любой вложенности #include и создаются метаданные …
Наверное из-за этого мои посты выглядят … /странно, что ли/

anonymous
()
Ответ на: комментарий от anonymous

Тип в декларации функции поменялся. Теперь дело за малым – поменять типы у всех переменных и во всех таких кастах на всех местах вызова этой функции.

Siborgium ★★★★★
()
Ответ на: комментарий от Siborgium

Тип в декларации функции поменялся. Теперь дело за малым – поменять типы у всех переменных и во всех таких кастах на всех местах вызова этой функции.

Использую VAssistX, он на 100% закрывает все мои «хотелки».
Не потому вам возражаю, чтобы настоять на своем.
Просто тех проблем о которых вы говорите у меня пару микронов …
Да и микроны эти правятся быстро.
Послушаем, что другие скажут.
Может быть и действительно у кого-то имеются такие проблемы …

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.