簡體   English   中英

C++ std::function<void()> 包含 shared_ptr</void()>

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM