我正在尝试为返回类型为std::function
且参数数目为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;
};
我尝试过,但是没有用。我要实现的目标是否有任何解决方法?
您可以考虑使用类型擦除,这是在运行时类型信息/多态下隐藏模板的常用方法。