Pull to refresh
46
Николай Меркин@nickolaym

User

1,7
Rating
20
Subscribers
Send message

Кажется, есть достаточно простое решение без ассемблера.

#include <iostream>

struct InitToken {};

// user-defined
void init_token();

inline InitToken g_init_token = (init_token(), InitToken{});
inline InitToken get_init_token() { return g_init_token; }

struct Sensor {
    explicit Sensor(InitToken = get_init_token()) {}
};

// если не раскомментировать, то будет ошибка линкера
// void init_token() { std::cout << "init" << std::endl; }

int main() {
    Sensor s;
}

https://godbolt.org/z/E9eWM8Gej

Инициализировать что-то строго до main - может быть узким местом. А вдруг понадобится конфигурировать из комстроки?

Ну вот я умею колдовать в компайл-тайме.

(И чтобы немножко себя простимулировать к дальнейшей писанине, - упомяну мой проект nenormal - исключительно чорная магия, демонстрация возможностей, не для продакшена)

Внезапно, но constexpr-функции могут содержать некоторое количество рантайма.

Другое дело, что ошибки в компайл-тайме сделать человекочитаемыми - это большое искусство.

Для внятной диагностики нужно

  • по возможности, всё обмазывать констрейнами

  • по возможности, делать констрейны на именованных концептах

  • по возможности, инкапсулировать многоэтажные шаблоны внутрь фиксированных типов (например, через наследование) - это убирает многословность

  • использовать зависимые типы - это увеличивает многословность, но при ошибке показывает значение, с которым возникла проблема; ну и вообще, повышает типизацию

Ставка на виндофон была здравой, но внезапно микрософт сделал несколько разворотов на 180, похоронив последовательно винмобайл, затем виндофон-7, затем виндофон-8. Сделали в полночь из платформы тыкву.

 «Просто дайте мне выделить текст»

Этот Артём Бологов намеренно заблокировал возможность выделить текст у себя в статье? Типа, "мне больно - и вам будет больно"? Или он рукожопый любитель свистелок-перделок? Курсор этот придурочный уже как бы намекает...

Как раз после прочтения биографии Вуда соорудил рупор из ватмана. И пугал с балкона тёток на другом конце парка. Физика работает!

Потому что не надо гоняться за "лидерами" рынка - эплом и самсунгом. Они напихали в часы всевозможные свистелкоперделки, а аккумулятор напихать не смогли. Что как бы говорит о высокой инженерной культуре!!!

У меня хуавей - с какой-то идиотской недо-осью, но заряд держат 10-15 дней. И заряжаются не от фирменной кроватки, а от любой беспроводной зарядки, хоть даже от телефона можно. До обычных касио, конечно, им далеко, но в повседневных условиях рулят.

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

Может быть, дядюшки ляо уже наловчились делать абибас с солнечной батарейкой, я хз. Чёртов нейропоиск что в гугле, что в яндексе нынче адски нерелевантен, а рыться на профильных форумах мне лень.

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

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

А без сил и средств ни пользы, ни забавы не получилось: скучная статья.

Какая скучная статья. Продавцы видят динамику продаж, всё!

Ни что, ни почему, ни технических подробностей.

Под техническими подробностями я имею в виду не то, что у вас в рекламных буклетах написано "с есим вы получите широкий ассортимент новых возможностей блаблабла", а - ну, хотя бы, как и какими именно из этих возможностей люди реально пользуются, а какие им нафиг не упали, но пришлось переплатить. Чем разные оси друг от друга отличаются, почему люди предпочитают то или другое. Насколько важен фактор вендорлока - то есть, если у человека айфон, то он, наверно, купит эплвоч, но так ли это в случае с другими платформами? Чем жертвует человек, покупая часы с есим (кроме цены)? И так далее и тому подобное...

Вам прислать фото разъединителя ВЛ-10? Вам рассказать, как его найти? Да проще некуда. Находите поселковый трансформатор 10-0.4 кВ, и на ближайшем же к нему столбе будет этот рубильник. Идёте от трансформатора вдоль ВЛ до ближайшей развилки, - и на развилке тоже будет рубильник.

А старинная детская забава кинуть проволоку на ЛЭП - это вообще в любом месте можно сделать, особенно, если линия не изолированная.

Насчёт много шума, нифига. Если в посёлке рубанулось электричество, то диспетчеру, конечно, оборвут телефон, но не более того. Мало ли что было, дерево на провода упало, что теперь, всей деревней по всему лесу бегать искать причину? Пусть аварийная бригада разбирается. А у них есть нормативы, как быстро приезжать. И на дальний хутор они просто на дорогу час-другой потратят.

Я тоже думал, что сюда ходят здравомыслящие. А не тупые демагоги, которые даже школьную математику не знают. Функция exp(-x) например монотонно убывает, а теперь давайте, вы, покажите, как она уходит в минус.

Статистику вы так и не показали, однако! Хоть "эту", хоть не эту, а вашу альтернативную. А здравомыслящие люди привыкли не верить пустым рекламным набросам.

Всё-таки, дизъюнкция - это не просто сложение, а сложение с насыщением. Поэтому от символа "+" возникает некое недоумение.

Хотя, конечно, дизъюнктивные формы удобнее читать со значками сложения и (неявного) умножения. Иначе от птичек вверх-вниз будет в глазах рябить.

Но об этом стоит сказать в самом начале статьи.

Генерал-электрик - это контора Эдисона.

... и в конце концов купил патент Лодыгина

Кому нужно не всё что душе угодно - берите не хаскелл, а идрис.

Разница в том, что на уровне определения класса могут возникать неразрешимые зависимости.

Например, derived::foo доступна тогда, когда доступна base::bar. Но base::bar доступна тогда, когда доступна (или не доступна) T::foo, где T = derived.

Ну а внутри функции можно делать ассерты. То есть, функция будет доступна, но, например, приводить к ошибке компиляции.

Кстати сказать, для создания неразрешимых зависимостей необязательно даже наследование. Достаточно сослаться на себя самого. Парадокс брадобрея, причём хоть переборчивого (который бреет только тех, кто не бреет себя), хоть просто любопытного (который бреет всех, но интересуется на входе).

struct barber {
  template<class T>
  void shaves(T& client)
  requires (!requires { client.shaves(client); })
  {} // этих рукожопов бреем так...

  template<class T>
  void shaves(T& client)
  requires (requires { client.shaves(client); })
  {} // а этих лентяев бреем этак...

  static_assert(requires(barber b) { b.shaves(b); });
  // рукожоп или лентяй?
};

(Это плохая иллюстрация, - зависимость будет неразрешима и за пределами определения класса. Просто чот внезапно пришло в голову показать фокус).

Ну а попроще, более классически, - почему класс в месте определения класса неполный, -

struct selfy {
  char c[sizeof(selfy)];
};

struct exploding {
  char e[sizeof(exploding) + 1];
};

struct okay {
  char o[123];
  int foo() { return sizeof(okay); }
};

Очень вычурный дизайн, когда один миксин чего-то хочет от другого миксина.

Брошу всё, стану проституткой.

В смысле что мешает.

А что мешает в хаскелле в IO-функции писать факью одновременно с выполнением какой-то полезной работы? А что мешает в чистой функции сделать unsafePerformIO и написать факью оттуда?

Нет, неизвестно. На этапе компиляции дженерик-функции она ничего не знает про типы аргументов, кроме того, что они принадлежат указанным тайпклассам.

Впрочем, это действительно детали реализации.

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

1
23 ...

Information

Rating
1,909-th
Location
Санкт-Петербург, Санкт-Петербург и область, Россия
Registered
Activity