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

4

我希望从action成员函数中调用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);
}

2
请查看std::function - πάντα ῥεῖ
1
...和/或std::bind - filmor
1
... 和 std::forward - πάντα ῥεῖ
嗯...我在想你为什么需要这样的东西?有人可以解释一下吗? - nbro
3
...和std::clinic - Captain Obvlious
...和 []{ foo(1,2); } - Casey
1个回答

4
你可以使用std::functionstd::bind来避免对Foo进行模板化:
#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),以免费获得智能指针的好处。


请注意,Foo 的创建者有时可能需要使用 std::ref - Yakk - Adam Nevraumont
如果函数实际上是另一个对象的构造函数,该怎么办? 我必须调用 new Type(args)。 - manasij7479
构造函数是未命名的成员函数,不能像函数调用一样直接调用。您需要创建一个帮助函数来调用 new T(args...) - Captain Obvlious
@manasij7479:你说的是一个新表达式,而不仅仅是构造函数调用(构造函数无法直接调用,也不能取其地址)。你需要将其放入一个函数中,例如使用lambda表达式。 - Deduplicator

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接