2017
плюсомрази до сих пор не изобрели пакетный менеджер
Почему Base and Derived ковариантны, однако, shared_ptr<Base> and shared_ptr<Derived> - нет?
Угадайте не гугля откуда ента цитата:
Именно поэтому я считаю с++ программистов именно «Программистами» с большой буквы. Они как хирурги в современном мире программирования ) А остальные так… педиатры всякие, медбратья )
Предлагаю включить в стандарт ISO C++ следующую строчку. Ну, чтобы не было недоразумений.
Any program that written in C++ is ill-formed.
путь к успеху: начало https://v1.std3.ru/70/40/1427403964-7040334ac7b8e3c3a8cde205f43d6b7f.jpg
Чо напечатает эта программа?
inb4: нахуй пошел
#include <stdio.h>
class A {
bool m_init;
public:
A(){m_init = true; printf ("ctor\n");}
~A(){
printf ("dtor\n");
if (m_init) {
deinit();
}
}
void deinit () {
printf ("deinit!\n");
m_init = false;
}
};
int main() {
A a;
a.~A();
return 0;
}
Все мы любим частично специализировать шаблоны.
Вот примерно так:
template <class>
struct Flip;
template <class A, class B>
struct Flip <std::pair<A, B>>
{};
template <class A>
struct Flip <std::array<A, 2>>
{};
Неудобно, что перед тем как использовать новое имя в аргументах, его нужно сначала объявить в параметрах шаблона.
Из-за этого код бывает многословным:
template <class T, T A, class B>
struct Cons;
template <class T, template<T...>class Arr, T Head, T...Tail>
struct Сons <T, Head, Arr<Tail...>>
{};
Что, если сделать специальный синтаксический сахар (с транслятором в стандартные кресты) для того, чтобы можно было делать объявления прямо внутри аргументов?
template <>
struct Flip <std::pair<class A, class B>>
{};
template <>
struct Flip <std::array<class A, 2>>
{};
template <template<class T...>class Arr>
struct cons <T Head, Arr<T...Tail>>
{};
template <>
без параметров можно опустить.
Вместо template<class T...>class Arr
в объявлении можно писать class Arr<T...>
.
И заменить ключевое слово class
на @
.
struct Flip <std::pair<@A, @B>>
{};
struct Flip <std::array<@A, 2>>
{};
template <@Arr<@T...>>
struct cons <T Head, Arr<T...Tail>>
{};
Да, не стоит забывать, что объявленное можно использовать более одного раза. Следующие строки эквивалентны:
template <class A> struct Eq <A, A> {};
struct Eq <@A, @A> {};
struct Eq <@A, A> {};
С таким сахаром писать на крестах будет немного проще.