使用 std::function 作为具有任意数量参数的数据成员
Using std::function as data member with arbitrary number of arguments
>我正在尝试创建一个具有std::function
作为数据成员的类。
像这样:
template<typename ... Args>
using Function = std::function<void(Args...)>;
struct UI_Element
{
std::shared_ptr<UI_Element> parent;
std::vector<std::shared_ptr<UI_Element>> children;
Function<> callbackFunc;
template<typename F>
void registerCallbackFunc(const F& f)
{
callbackFunc = f;
}
template<typename ... Args>
void doFunc(Args&& ... args)
{
callbackFunc(std::forward<Args>(args)...);
}
};
问题是它显然适用于不接受任何参数的函数(由于 Function<>(。例如
void doStuff()
{
std::cout << "This function worksn";
}
有没有办法注册包含任意数量参数的回调函数?
还是其他方式,不使用std::function
来实现我想要的?
每个具有不同参数列表的std::function
都是一个单独的类。由于成员只能具有一种类型,因此实现此目的的唯一方法是隐藏该类型。
因此,这在技术上可以通过将函数包装器存储在std::any
中来实现。也许可以编写一个更具体的"任何函数"包装器,但遵循"工作":
std::any callbackFunc;
template<typename ... Args>
void registerCallbackFunc(std::function<void(Args...)> f)
{
callbackFunc = std::function(f);
}
template<typename ... Args>
void doFunc(Args ... args)
{
std::any_cast<std::function<void(Args...)>>(callbackFunc)(std::move(args)...);
}
这不是很好处理。不允许引用参数(未实现强制(,并且必须使用完全正确的类型传递参数,因为隐式转换无法通过此接口。因此,如果您注册void(int)
,则无法void(long)
调用它。
如果尝试使用错误数量的参数进行调用,则会引发异常。
我的结论:没有简单的解决方案可以将具有不受约束的参数列表的函数存储到单个类型中。这种尝试当然不足以用于一般用途。
相关文章:
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- 如何使用Visual Studio 2017在C++中为参数化对象数组使用唯一指针
- 在C++中传递给函数时,为什么要指定数组大小作为参数
- C++ - 声明指向返回任何类型并获取任意数量参数的函数的指针
- 具有任意数量参数的模板函数
- 使用 std::function 作为具有任意数量参数的数据成员
- 使用模板将任意类型参数传递给 C++ 中的函数
- C++具有模板成员的类,该类使用任意模板参数构造模板成员
- is_invocable使用任意函数参数类型
- 如何为函数参数指定任意模板参数?
- 如何在C++中找到任意数组的大小
- 在具有任意数量子级的节点树中查找节点
- 变量数参数列表从其第二个条目开始
- 读取任意大小的任意数组
- 函数指向具有任意数量参数的任何成员函数
- 如何创建一个工厂函数模板来构造给定任意数量参数的对象
- 如何传递任意数组的结构到一个函数
- 可以在c++中使用任意模板参数