Я бы хотел избежать косвенного обращения через constructMixin и напрямую создавать каждый унаследованный объект mixin, чтобы избежать необходимости в конструкторе копирования / перемещения для типа mixin.Возможно ли это?
Вам понадобятся миксины, чтобы разрешить кусочную конструкцию напрямую.К сожалению, это довольно повторяющееся, поэтому вы можете использовать макрос вроде:
#define PIECEWISE_CONSTRUCT(Type) \
template <typename Tuple> \
Type(std::piecewise_construct_t, Tuple&& tuple) \
: Type(std::piecewise_construct, \
std::forward<Tuple>(tuple), \
std::make_index_sequence<std::tuple_size_v<Tuple>>()) \
{ } \
template <typename Tuple, size_t... Indexes> \
Type(std::piecewise_construct_t, Tuple&& tuple, \
std::index_sequence<Indexes...>) \
: Type(std::get<Indexes>(std::forward<Tuple>(tuple))...) \
{ }
Для использования в качестве:
struct MixinA : public MixinBase {
MixinA(int, const std::string&, const std::string&) {}
PIECEWISE_CONSTRUCT(MixinA)
};
struct MixinB : public MixinBase {
MixinB(const std::string&, const std::string&) {}
PIECEWISE_CONSTRUCT(MixinB)
};
template <typename... Mixins>
struct Composition : private Mixins... {
template <typename... Packs>
Composition(Packs&&... packs)
: Mixins(std::piecewise_construct, std::forward<Packs>(packs))...
{ }
};
Гарантированное разрешение копирования, к сожалению, не может работать при построении подобъектов - так что этоможет быть, ваш лучший выбор.Я не думаю, что вы можете сделать это напрямую, не имея каких-то вложенных пакетов?Вполне возможно, что я просто недостаточно креативен, и мне было бы очень любопытно, если бы кто-нибудь придумал что-то лучшее.