B
Size: a a a
A
m
f
B
A
struct FunctorBase {И возникает проблема из-за глупого ограничения, что после template parameter pack нельзя указать фиксированный параметр. Из-за этого в классе
// Это тип указателя, владеющего инстансами: std::unique_ptr<FunctorBase>. Нужен только для корректной деаллокации объекта.
virtual ~FunctorBase() = default;
};
template <typename... Args>
struct FunctorInvokable : FunctorBase {
// Этот тип известен в месте использования объекта - делаем каст и вызываем operator()
virtual void operator()(Args&&... args) const = 0;
};
template <class Invokable, typename... Args>
struct Functor final : FunctorInvokable<Args...> {
// Этот тип известен только в месте конструирования объекта и больше нигде
explicit Functor(Invokable&& invokable) : _invokable{ std::move(invokable) }
{}
void operator()(Args&&... args) const override {
_invokable(std::forward<Args>(args)...);
}
private:
const Invokable _invokable;
};
Functor
шаблонный параметр Invokable
обязан быть первым, а это ломает автоматическое выведение типов, и я не могу написать:Functor<Arguments...> f{ [](Arguments... args) {} };
Выкрутиться можно, объявив лямбду перед созданием функтора:auto lambda = [](Arguments... args) {};Есть ли более простой/изящный способ?
Functor<decltype(lambda), Arguments...> f{ std::move(lambda) };
N
struct FunctorBase {И возникает проблема из-за глупого ограничения, что после template parameter pack нельзя указать фиксированный параметр. Из-за этого в классе
// Это тип указателя, владеющего инстансами: std::unique_ptr<FunctorBase>. Нужен только для корректной деаллокации объекта.
virtual ~FunctorBase() = default;
};
template <typename... Args>
struct FunctorInvokable : FunctorBase {
// Этот тип известен в месте использования объекта - делаем каст и вызываем operator()
virtual void operator()(Args&&... args) const = 0;
};
template <class Invokable, typename... Args>
struct Functor final : FunctorInvokable<Args...> {
// Этот тип известен только в месте конструирования объекта и больше нигде
explicit Functor(Invokable&& invokable) : _invokable{ std::move(invokable) }
{}
void operator()(Args&&... args) const override {
_invokable(std::forward<Args>(args)...);
}
private:
const Invokable _invokable;
};
Functor
шаблонный параметр Invokable
обязан быть первым, а это ломает автоматическое выведение типов, и я не могу написать:Functor<Arguments...> f{ [](Arguments... args) {} };
Выкрутиться можно, объявив лямбду перед созданием функтора:auto lambda = [](Arguments... args) {};Есть ли более простой/изящный способ?
Functor<decltype(lambda), Arguments...> f{ std::move(lambda) };
РО
K