Как стать автором
Обновить
6
0
Иван @Ivanbk

Пользователь

Отправить сообщение
Ошибочка в скриншоте расположения сегментов. COM2, символ 6, закрашен сегмент «J», а не «K»
Во первых это был способ, а не цель.
Цель заключается в том, чтобы получить собственный тип не зная своего имени класса.
using self = Foo; — это конечно очевидно, но появляется возможность ошибки, например копипаста.
Можно сделать такой define:
#define DECLARE_SELF \
	static auto selfTypeHelper() -> UnPtr<decltype(this)>; \
	using Self = decltype(selfTypeHelper())

а потом применять его где это необходимо:
class Foo {
	DECLARE_SELF;
};

Ну а для чего нужен собственный тип? например для следующего:
...
offsetof(Self, field);
...
Хотел бы рассказать еще один секрет про auto и decltype, но неохото создавать новую тему ибо она слишком мала.
А секрет заключается в следующем:
обращение к параметру this в статическом методе
class Foo {
	static auto self() -> decltype(this);
};
Потрогал в магазине Xiaomi отвертку
Сравнение с моим вариантом:
обороты 2.5, у моей 3.5 об/сек
длинна сантиметра на 3 длиннее чем моя
диаметр на миллиметр тоньше чем моя
вес примерно одинаковый
мощность показалась слабее моей
подсветка слабая
наличие блокировочной муфты
отсутствие регулировки скорости
отсутствие регулировки усилия
отсутствие зарядника (работа от 2 AAA батареек)
цена 3000, себестоимость моей около 1000р
Шестигранник в тисковых условиях просверлить ровно не удалось.
Работа от одного заряда примерно 2 часа непрерывного вращения.
Степап до 13В
Скорость вращения 3.5 оборота в секунду.
При испытании на саморезе в гипсокартон пришлось придать усилие рукой. в металл не пробовал.
Семпл
Извините за мою профессиональную съемку

Измеряется ток, протекающий через драйвер и сравнивается с задающим потенциометром. Если значение привышает — двигатель останавливается до опускания кнопки. Если честно, то эта функция работает не очень гладко, т.к. с двигателя и степапа идут очень большие выбросы и мне не удалось из нормально сгладить.

Мой вариант:image
Диаметр: 18;
Длинна без вала 126;
Кнопки вперед / назад;
Регулировка скорости;
Регулировка ограничения усилия;
USB зарядка;
Индикатор заряда;
Подсветка на торце.
Сегодня собрал, шестигранник пока не прикрутил.
ну, в частности у меня gcc version 4.9.2 (AVR_8_bit_GNU_Toolchain_3.5.3_1700) на других архитектурах и версиях не проверял
В том то и дело, что нет, но результат всегда будет 0.
Вот это явная дыра:
template<int value>
struct B {
	enum {VALUE = value};
};
struct A {
	int v1;
	int v2;
	static auto offset() -> B<(int)&this->v2 - (int)&this->v1>;
};
...
decltype(A::offset())::VALUE; //Что вернет такое выражение?
А мне не нужен this, мне нужна только декларация. Функция никогда не будет вызываться, у нее даже тела нет. С помощью ее я могу узнать собственный тип там где обычно это невозможно.
Скорее всего для того, чтобы выпендриться.
а вот пример, где описание типа в конце полезно:
static auto selfTypePtr() ->decltype(this);

Кстати интересный пример — статический метод использующий this
Но, самое главное, совершенно не ясно, почему вы проигнорировали вариант
myMap.insert({ 'a', 10 });
К сожалению, как я уже сказал, я не знал про списки инициализации. я думал, что это применимо только к инициализации переменных
MyObj obj = {1, 2, 3};
и по этому мне пришлось изобретать велосипед.
У типа int нет и не может быть конструктора
понятно, что у int нет конструктора, я просто привел простой пример.
Что вы хотели сказать вот этим: ((Types&&)args...)?
если конечный конструктор принимает ссылку на объект, то без этого преобразования конструктор будет пытаться получить ссылку на промежуточную переменную, а не на первоначальный объект.

Спасибо всем за обсуждение, вы повысили мои познания языка. Где как не в споре рождается истина.
Спасибо. видимо я это проморгал
А в чем разница с этим:
struct A {
A(signed char v): v(v){}
A(unsigned char v): v(v){}
int v;
};
A a(1); //???

если у вас несколько неявных кандидатов, то уж извините

Информация

В рейтинге
Не участвует
Откуда
Екатеринбург, Свердловская обл., Россия
Дата рождения
Зарегистрирован
Активность