[英]C++ std::function<void()> contained shared_ptr
该项目有一些回调函数:
using fn = std::function<void()>;
回调 function 是 class X 的构造函数的参数:
class X(fn).
X x([](){})
X.fn()
我想介绍另一种类型的回调function来表示id,所以我需要另一种类型:
using xfn = std::function<void(int)>;
有没有一种可能的方法来更改参数,以便它可以支持两种类型的 function。 该项目已经包含许多代码,第一种类型为 function。 它们用X.fn()
调用。 我正在尝试使 class X 支持X.fn(100)
。 所以人们可以同时调用X.fn()
和X.fn(100)
,同名 fn。 (我不希望它成为具有不同名称的新成员),就像具有默认值的 function 一样。 fn() = fn(int val=100)
我想介绍:
X x([](int x){})
X.fn(100)
是否可以将 class 构造函数更改为更通用的原型函数,例如
class X(genereal fn)
这样如果 class X 可以同时接收[](){}
和[](int){}
。
您可以使用模板和std::function
使其接受您喜欢的任何类型,如下所示
template<typename ...T>
struct X{
X(std::function<void(T...)>&& fn_):fn{std::move(fn_)}{}
std::function<void(T...)> fn;
};
int main()
{
X<int> x1{[](int x){std::cout << "\n" << x;}};
x1.fn(3);
X<> x2{[]( ){std::cout << "\nnon";}};
x2.fn();
}
假设您想使用相同的 class 并允许存储和访问这两个函数,您可以尝试以下方法:
#include <functional>
#include <iostream>
struct X
{
struct Wrapper
{
Wrapper(std::function<void(int)> pfn)
: fn(pfn)
{ }
Wrapper(std::function<void()> pfn)
: fn([pfn](int) { pfn(); })
{ }
void operator()()
{
fn(0);
}
void operator()(int v)
{
fn(v);
}
std::function<void(int)> fn;
};
X(std::function<void()> pfn)
: fn(pfn)
{ }
X(std::function<void(int)> pfn)
: fn(pfn)
{ }
Wrapper fn;
};
int main()
{
X x1([]() { std::cout << "no arg" << std::endl; });
X x2([](int arg) { std::cout << "int arg = " << arg << std::endl; });
x1.fn();
x2.fn(100);
return 0;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.