如何存储可变参数类型的参数

How can I store the arguments of a variadic type?

本文关键字:参数 变参 类型 何存储 存储      更新时间:2023-10-16

我想从动作成员函数而不是构造函数调用这个foo函数。
为此,我必须将值存储在某个地方。
我无法弄清楚执行此操作的语法。

#include <iostream>
void foo(int a, int b)
{
    std::cout<<a<<b;
}
template<typename... Args>
struct Foo
{
public:
    Foo(Args... args){foo(args...);}
    void action(){}
private:
    //Args... ?
};
int main()
{
    Foo<int,int> x(1,2);
}

你可以放弃Foo的模板化,std::functionstd::bind

#include <functional>
#include <iostream>
void foo(int a, int b)
{
  std::cout<<a<<b;
}
struct Foo
{
public:
  template<typename... Args>
  Foo(Args&&... args)
      // bind the arguments to foo
    : func_(std::bind(foo, std::forward<Args>(args)...)) { }
  // then you're able to call it later without knowing what was bound to what.
  void action(){ func_(); }
private:
  std::function<void()> func_;
};
int main()
{
  Foo x(1,2);
  x.action();
}

编辑:为了回答评论,要绑定构造函数,我会使用一个函数模板,例如

template<typename T, typename... Args> T *make_new(Args&&... args) {
  return new T(std::forward<Args>(args)...);
}

然后

std::bind(make_new<SomeClass, Args...>, std::forward<Args>(args)...)

重要样式说明:请考虑绑定到 std::make_sharedstd::make_unique(如果可以使用 C++14(,以免费获得智能指针的好处。