4

私の質問を説明する例があります:

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

特に、パラメータの長いリストを持ついくつかのクラスを取得した場合、これは面倒です。

パラメータパックで型を明示的に表示することを取り除く方法はありますか

4

1 に答える 1

6

コンストラクターを転送する場合は、それをテンプレートにします

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

いずれにせよ、通常は の初期化中に引数の型だけを気にしtます。

于 2020-01-16T09:08:20.837 に答える