【问题标题】:C++ std::function<void()> contained shared_ptrC++ std::function<void()> 包含 shared_ptr
【发布时间】:2020-07-15 03:01:47
【问题描述】:

项目有一些回调函数:

using fn = std::function<void()>;

回调函数是类X的构造函数的参数:

class X(fn).
X x([](){})
X.fn()

我想引入另一种回调函数来表示id,所以我需要另一种:

using xfn = std::function<void(int)>;

有没有一种可能的方法来更改参数,使其可以支持两种类型的功能。 该项目已经包含许多具有第一类功能的代码。他们用X.fn() 调用。我正在尝试让 X 类支持X.fn(100)。因此人们可以同时调用X.fn()X.fn(100),使用相同的名称fn。 (我不希望它成为具有不同名称的新成员),就像具有默认值的函数一样。 fn() = fn(int val=100)

我要介绍:

X x([](int x){})
X.fn(100)

是否可以将类构造函数更改为更通用的原型函数,例如

class X(genereal fn)

这样如果 X 类可以同时接收[](){}[](int){}

【问题讨论】:

标签: c++ prototype std-function


【解决方案1】:

你可以使用模板和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();
}

Live

【讨论】:

    【解决方案2】:

    假设您想使用同一个类并允许存储和访问这两个函数,您可以尝试以下方法:

    #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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-03
      • 1970-01-01
      • 1970-01-01
      • 2014-12-11
      • 2019-02-20
      • 2023-02-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多