实例化模板时必须在参数包中显式显示类型吗?

Must I explicitly show the types in the parameter pack when instantiate a template?

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

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

这很烦人,尤其是当我有一些 类 有很长的参数列表时。

那么有什么方法可以避免在参数包中显式显示类型

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

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

我们通常只关心 t 初始化时参数的类型,反正。