Можно ли сохранить аргументы / пакет параметров шаблона переменной, переданные в конструктор шаблона не класса, как атрибут этого класса без превращения этого класса в шаблон класса?
В настоящее время я занимаюсь разработкой класса тонкой оболочки (здесь я создал только минимальный пример, чтобы минимизировать сложность), который имеет следующую подпись:
class Wrapper final {
public:
template <typename Function, typename... Args>
auto start(Function&& function, Args&&... args) -> void;
};
Пакет параметров передается в шаблон функции-члена start<Function, ... Args>
и в настоящее время нет необходимости «хранить» либо function
, либо args
.Совершенная переадресация используется для дальнейшей обработки в этой функции.
Теперь я хотел бы добиться подписи (введение интерфейса класса ):
class WrapperInterface {
public:
virtual ~WrapperInterface() = default;
virtual auto start() -> void = 0;
};
// TODO(2019-03-17 by wolters) The following is non-working pseudo-code.
class Wrapper final : public WrapperInterface {
public:
template <typename Function, typename... Args>
explicit Wrapper(Function&& function, Args&&... args)
: function_{function}, args_{args} {
// NOOP
}
auto start() -> void {
// TODO(2019-03-17 by wolters) Invoke `function_` with `args_`.
function_(args);
}
private:
std::function<???> function_;
std::tuple<???> args_;
};
Тогда Wrapper
можно использовать следующим образом:
class WrapperClient final {
public:
WrapperClient() : wrapper_{[this](){
// std::cout << "started\n";
}} {
// NOOP
}
private:
Wrapper wrapper_;
};
Хотя класс интерфейса не требуется в приведенном выше примере, он требуется в целом, поскольку экземпляры должны бытьхранится в std::vector<std::unique_ptr<WrapperInterface>>
.
Я прочитал и попробовал Как хранить аргументы шаблона variadic? , но этот подход требует превращения Wrapper
в шаблон класса.
Я думаю, что-то похожее на реализацию QThread *QThread::create(Function &&f, Args &&... args)
требуется.К сожалению, этот код слишком сложен для меня.
Можете ли вы направить меня в правильном направлении?Возможно ли это с помощью закрытого шаблона класса реализации?