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

时间:2014-12-22 19:44:50

标签: c++ c++11 variadic-templates

我想从动作成员函数中调用此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);
}

1 个答案:

答案 0 :(得分:4)

您可以使用Foostd::function放弃std::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),以免费获得智能指针的好处。