[英]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.