Здравствуйте, ArtDenis, Вы писали:
BFE>>Макросы всегда труднее поддерживать, AD>Это спорный вопрос. Например, чтобы понять смысл Param<I>... мне пришлось напрячься + я не сразу въехал зачем нужен template <size_t> using Param = Arg, несмотря на то, что я стараюсь держать себя в курсе фишек новых плюсов.
А устройство BOOST_PP_ENUM_PARAMS напряжения не вызвало?
Здравствуйте, rg45, Вы писали:
A>>А что просто указатель на инты и их количество в bar не передать? Один предок, имхо получишь большее удобство пользования полиморфизмом времени исполнения, он же тебе явно нужен, раз ты хочешь виртуальный bar. R>Тогда ему пришлось бы в рантайме контролировать число переданных фактических параметров. Организовывать диспетчеризацию и обрабатывать ошибки, которые мог бы предотвратить компилятор. Где же тут удобство?
А гору шаблонов с кучей параметров типа удобнее поддерживать?
R>И удобств меньше и качество кода страдает.
Сильно сомнительно, что про первое, что про второе.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Здравствуйте, andyp, Вы писали:
D>>Можно ли?
A>А что просто указатель на инты и их количество в bar не передать? Один предок, имхо получишь большее удобство пользования полиморфизмом времени исполнения, он же тебе явно нужен, раз ты хочешь виртуальный bar.
Увы, сторонний код, который у меня поправить нет возможности, предоставляет интерфейс такого вида:
Причём у блока (это objc-шный аналог лямбды, вот то что с "^" и до "}") — JSValue* на выходе и некоторый набор JSValue* на входе, при этом это не переменный список аргументов, поэтому va_list не воспользоваться, я уже пробовал.
Поэтому мне надо сформировать шаблон, который бы делал бы вот такой вызов.
Я сделаль, работает.
Но появилась другая проблема — как это спрятать внутрь чисто-c++-кода. Ответ — никак.
Потому что Objc++ шаблон не скомпилируется в чистом C++.
Здравствуйте, Vain, Вы писали:
R>>Тогда ему пришлось бы в рантайме контролировать число переданных фактических параметров. Организовывать диспетчеризацию и обрабатывать ошибки, которые мог бы предотвратить компилятор. Где же тут удобство? V>А гору шаблонов с кучей параметров типа удобнее поддерживать?
Здравствуйте, rg45, Вы писали:
V>>Сильно сомнительно, что про первое, что про второе. R>Ваше мнение очень ценно для нас.
Это приятно, что ты помнишь про свой камингаут в политике.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
На сколько понял, ты умеешь вызывать такую мумбу-юмбу из плюсов и тебе надо ее дергать в зависимости от имени функции с нужными параметрами? Ну так сделай на плюсах map с ключом-именем функции, в мап положи std::function, в которые засунь лямбды, хватающие нужные параметры через замыкание. Внутри лямбд вызывай obj-c?
Здравствуйте, rg45, Вы писали:
R>Здравствуйте, Dair, Вы писали:
R>>>using Foo = Foo_<Ret, Arg, std::make_index_sequence<N>>; D>>Отлично, спасибо большое! D>>(не знал про std::make_index_sequence)
R>При желании можно было бы оформить небольшую утилитку, которая щьет сразу последовательность типов (tuple) вместо последовательности индексов. С другой стороны, я сомневаюсь, что этот инструмент найдет хоть сколько-нибудь широкое применение, тогда как цена всего-то одна лишняя строчка в базаовом классе Foo_.
Долго не понимал зачем нужен boost::mp11, а это как-раз оно и есть.
template <typename Ret, typename... Args>
class Foo_ {
public:
virtual Ret bar(Args...) = 0;
};
template <typename Ret, typename Arg, size_t N >
using Foo = boost::mp11::mp_append< Foo_<Ret>, boost::mp11::mp_repeat_c< boost::mp11::mp_list<Arg>, N > >;