Я пытаюсь написать оболочку для std::function
s с типом возврата void
и переменным числом std::string
аргументов.
template<class... Args>
class ConsoleCommand
{
public:
ConsoleCommand(const std::string& name, const std::function<void(Args...)>& function) :
name{ name },
function{ function }
{
}
void operator()(Args... args)
{
function(std::forward<Args>(args)...);
}
private:
std::string name;
std::function<void(Args...)> function;
};
Так что это работает правильно, за исключением того факта, что арность функции должна быть включена в тип экземпляра, и я пытаюсь избежать этого.
ConsoleCommand<std::string> ex1; //unary function
ConsoleCommand<std::string, std::string> ex2; //dyadic function
Я хочу иметь контейнер с этими объектами (std::vector<ConsoleCommand<std::string>>
), и было бы здорово, если бы я мог сделать так, чтобы аргумент шаблона класса ссылался только на тип аргументов, а не на весь пакет.
template<class Args>
class ConsoleCommand
{
public:
ConsoleCommand(const std::string& name, const std::function<void(Args...)>& function) :
name{ name },
function{ function }
{
}
void operator()(Args... args)
{
function(std::forward<Args>(args)...);
}
private:
std::string name;
std::function<void(Args...)> function;
};
Я попробовал это, но это не сработало. Будет ли какой-нибудь обходной путь для того, чего я пытаюсь достичь?