【发布时间】:2020-04-23 14:46:46
【问题描述】:
我正在尝试为 std::functions 编写一个包装器,其返回类型为 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;
};
所以这是正确的,除了函数的 arity 必须根植于实例的类型中,我试图避免这种情况。
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;
};
我试过了,但是没有用。对于我想要实现的目标,是否有任何解决方法?
【问题讨论】:
-
您想如何使用该包装器?这个问题似乎不完整
-
您可能有别名让
ConsoleCommandN<string, 4>等同于ConsoleCommand<string, string, string, string>。 -
这在您使用
std::function的方式下是不可能的。std::function不能不知道它将采用多少个参数。您可能希望使用any之类的类型擦除类型或span之类的可变大小视图类型来代替std::function的参数类型。
标签: c++ templates variadic-templates