繁体   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