我有一个例子来说明我的问题:

#include <utility>

class Foo {
 public:
  Foo(int i) {}
};

template<typename T, typename ...Args>
class Bar {
 public:
  T t;
  Bar(Args &&... args) : t(std::forward<Args>(args)...) {}
};

如果我想实例化此模板:
Bar<Foo> foo(1);

编译器抛出错误:
no matching function for call to ‘Bar<Foo>::Bar(int)’

所以我必须写这个:
Bar<Foo, int> foo(1);

这很烦人,特别是如果我有一些带有很长参数列表的类。

所以有什么方法可以摆脱在参数包中显式显示类型的问题

最佳答案

如果要构造函数转发,请将该模板设为

template<typename T>
class Bar {
 public:
  T t;
  template<typename ...Args>
  Bar(Args &&... args) : t(std::forward<Args>(args)...) {}
};

无论如何,我们通常只关心t初始化期间的参数类型。

10-06 05:15
查看更多