Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
typedef const const_int_ptr* const_ptr; // неизменяемый указатель на предыдущий указательЭто изменяемый указатель на неизменяемый указатель на неизменяемый int.const_ptr или const_int_ptr. Заметьте, что const и ptr у вас в обоих случаях значат совершенно разные вещи: в первом случае у вас константный указатель на указатель, а во втором случае — указатель на константный int.typedef), Си имеет прекрасную нотацию. Главное её использовать правильно; например, писать const справа:int const * const * const ptr;
ptr — это константный указатель на константный указатель на константный int.const int *var; — указатель на переменную, которая не может менять значение.— эти 2 объявления означают абсолютно одно и то же. Чтобы получить неконстантный указатель на константные данные, нужно написать:
int const *var; — указатель, который не может менять свое значение, на переменную int, которая может…
int * const z;
*, относится к тому на что указываем, а то что после * — к самому указателю. ДемоК чему я призываю? Да вот к чему: коллеги-программисты и те, кто хочет ими стать! Будьте проще, не кичитесь своими знаниями глубин Си
ptr<const ptr<volatile ptr<const int> > >
Что в сложных случаях будет читабельнее, чем Си вариант. Или с привкусом D:ptr ! const ptr ! volatile ptr ! const int
const std::string& var вместо const char* const* var — char* скрыт в объекте std::string. Да еще и ссылка вместо указателя.std::function< std::function<int (int)> (std::function<int (int, int)>) >
void(*(*(*(*f())(void(*)()))(void(*)()))(void(*)()))();Разбавить квалификаторами по вкусу.typedef void(*g0)();
typedef g0(*g1)(g0);
typedef g1(*g2)(g0);
typedef g2(*g3)(g0);
g3 g();Теперь читаемо.std::function<
std::function<
std::function<
std::function<
void()
>(std::function<void()>)
>(std::function<void()>)
>(std::function<void()>)
> h();
Я бы сказал, что никаких плюсов перед typedef в плане выразительности std::function не представляет. Наоборот, я мало того, что указываю, что тип — функция, я ещё и указываю сигнатуру функции рядом используя Си нотацию. Многословненько.fn< fn<int (int)> ( fn<int (int, int)> ) >std::function это не равнозначная замена, у нее есть рантайм издержки.
Будь проще, и люди потянутся к тебе, или как полюбить Си, сохранив рассудок