Во первых это был способ, а не цель.
Цель заключается в том, чтобы получить собственный тип не зная своего имени класса.
using self = Foo; — это конечно очевидно, но появляется возможность ошибки, например копипаста.
Можно сделать такой define:
#define DECLARE_SELF \
static auto selfTypeHelper() -> UnPtr<decltype(this)>; \
using Self = decltype(selfTypeHelper())
а потом применять его где это необходимо:
class Foo {
DECLARE_SELF;
};
Ну а для чего нужен собственный тип? например для следующего:
Хотел бы рассказать еще один секрет про auto и decltype, но неохото создавать новую тему ибо она слишком мала.
А секрет заключается в следующем:
обращение к параметру this в статическом методе
class Foo {
static auto self() -> decltype(this);
};
Потрогал в магазине Xiaomi отвертку
Сравнение с моим вариантом:
обороты 2.5, у моей 3.5 об/сек
длинна сантиметра на 3 длиннее чем моя
диаметр на миллиметр тоньше чем моя
вес примерно одинаковый
мощность показалась слабее моей
подсветка слабая
наличие блокировочной муфты
отсутствие регулировки скорости
отсутствие регулировки усилия
отсутствие зарядника (работа от 2 AAA батареек)
цена 3000, себестоимость моей около 1000р
Шестигранник в тисковых условиях просверлить ровно не удалось.
Работа от одного заряда примерно 2 часа непрерывного вращения.
Степап до 13В
Скорость вращения 3.5 оборота в секунду.
При испытании на саморезе в гипсокартон пришлось придать усилие рукой. в металл не пробовал.
Измеряется ток, протекающий через драйвер и сравнивается с задающим потенциометром. Если значение привышает — двигатель останавливается до опускания кнопки. Если честно, то эта функция работает не очень гладко, т.к. с двигателя и степапа идут очень большие выбросы и мне не удалось из нормально сгладить.
Мой вариант:
Диаметр: 18;
Длинна без вала 126;
Кнопки вперед / назад;
Регулировка скорости;
Регулировка ограничения усилия;
USB зарядка;
Индикатор заряда;
Подсветка на торце.
Сегодня собрал, шестигранник пока не прикрутил.
А мне не нужен this, мне нужна только декларация. Функция никогда не будет вызываться, у нее даже тела нет. С помощью ее я могу узнать собственный тип там где обычно это невозможно.
Но, самое главное, совершенно не ясно, почему вы проигнорировали вариант
myMap.insert({ 'a', 10 });
К сожалению, как я уже сказал, я не знал про списки инициализации. я думал, что это применимо только к инициализации переменных
MyObj obj = {1, 2, 3};
и по этому мне пришлось изобретать велосипед.
У типа int нет и не может быть конструктора
понятно, что у int нет конструктора, я просто привел простой пример.
Что вы хотели сказать вот этим: ((Types&&)args...)?
если конечный конструктор принимает ссылку на объект, то без этого преобразования конструктор будет пытаться получить ссылку на промежуточную переменную, а не на первоначальный объект.
Спасибо всем за обсуждение, вы повысили мои познания языка. Где как не в споре рождается истина.
Цель заключается в том, чтобы получить собственный тип не зная своего имени класса.
using self = Foo; — это конечно очевидно, но появляется возможность ошибки, например копипаста.
Можно сделать такой define:
а потом применять его где это необходимо:
Ну а для чего нужен собственный тип? например для следующего:
А секрет заключается в следующем:
обращение к параметру this в статическом методе
Сравнение с моим вариантом:
обороты 2.5, у моей 3.5 об/сек
длинна сантиметра на 3 длиннее чем моя
диаметр на миллиметр тоньше чем моя
вес примерно одинаковый
мощность показалась слабее моей
подсветка слабая
наличие блокировочной муфты
отсутствие регулировки скорости
отсутствие регулировки усилия
отсутствие зарядника (работа от 2 AAA батареек)
цена 3000, себестоимость моей около 1000р
Работа от одного заряда примерно 2 часа непрерывного вращения.
Степап до 13В
Скорость вращения 3.5 оборота в секунду.
При испытании на саморезе в гипсокартон пришлось придать усилие рукой. в металл не пробовал.
Извините за мою профессиональную съемку
Измеряется ток, протекающий через драйвер и сравнивается с задающим потенциометром. Если значение привышает — двигатель останавливается до опускания кнопки. Если честно, то эта функция работает не очень гладко, т.к. с двигателя и степапа идут очень большие выбросы и мне не удалось из нормально сгладить.
Диаметр: 18;
Длинна без вала 126;
Кнопки вперед / назад;
Регулировка скорости;
Регулировка ограничения усилия;
USB зарядка;
Индикатор заряда;
Подсветка на торце.
Сегодня собрал, шестигранник пока не прикрутил.
а вот пример, где описание типа в конце полезно:
Кстати интересный пример — статический метод использующий this
понятно, что у int нет конструктора, я просто привел простой пример.
если конечный конструктор принимает ссылку на объект, то без этого преобразования конструктор будет пытаться получить ссылку на промежуточную переменную, а не на первоначальный объект.
Спасибо всем за обсуждение, вы повысили мои познания языка. Где как не в споре рождается истина.
struct A {
A(signed char v): v(v){}
A(unsigned char v): v(v){}
int v;
};
A a(1); //???
если у вас несколько неявных кандидатов, то уж извините