в качестве шаблонного параметра: https://godbolt.org/z/59n13P
Проблема в том, что некоторые типы (int, double, enum etc.) в принципе не могут иметь методов. Как следствие компилятор ругается на такой код, даже если add_method никогда не вызывается (—> шаблон не инстанциируется). Есть ли какой-то изящный способ это пофиксить? Можно конечно для типов с методами и типов без методов завести свой TypeInfoBuilder с/без add_method, потом их как-то отнаследовать чтобы не дублировать код, как-то решить проблему с возвращаемым типом билдера (через CRTP?)... Но все это выглядит дико громоздко. Есть ли какой-то более изящный способ? С enable_if или специализацией?
Помимо enable_if есть if constexpr и концепты.
К сожалению моя компания использует очень старый компилятор, который даже C++11 не полностью поддерживает, поэтому не вариант :) А можно пример как бы эта задача решалась на if constexpr или концептах?
Кажется я не прав и достаточно простого static_assert, но это потребовало переноса member из nttp в аргументы функции. Мне не удалось придумать изящную реализацию оригинального интерфейса с использованием C++20. https://godbolt.org/z/7MEhj7
К сожалению перенос метода в аргументы функции тоже не вариант по ряду причин, мне он нужен в compile-time контексте. Может в будущем это поменяется, но пока вот так. Тем временем я попробовал пофиксить проблему через CRTP: https://godbolt.org/z/WbEqT7 . Слегка громоздко, но на первое время пойдет.
Спасибо, решение с C++11 выглядит неплохо!
Обсуждают сегодня