C++ 17では、instantiate objects without specifying the template typesに可能です。基本的には、このコードはコンパイルします:C++で転送参照を使用する場合、テンプレート構造体にstd :: decayが必要ですか?
std::pair p(2, 4.5); // deduces to std::pair<int, double> p(2, 4.5);
std::tuple t(4, 3, 2.5); // same as auto t = std::make_tuple(4, 3, 2.5);
ので、以下のコードを仮定:
template<typename... Ts>
struct Foo
{
Foo(Ts&&... ts) :
ts{std::forward_as_tuple(ts...)}
{}
std::tuple<Ts...> ts;
};
int main()
{
auto f = [] { return 42; };
Foo foo{f, [] { return 84; }};
}
は、私はこのようなタプル宣言でstd::decay
を使用する必要がありますか?私はFooののコンストラクタでこのパターンを見ることができます
template<typename T>
auto make_baz(T&& t) -> baz<std::decay_t<T>>;
そして、それは転送を使用しています。このため
std::tuple<std::decay_t<Ts>...> ts;
は、私は推測テンプレートの種類に基づいてオブジェクトを返すように関数を記述したい方法ですタプルに値を正しく渡すための参照。私は、ここでタイプの控除が同じように動作するかどうかはわかりません。
控除ガイドを追加してみませんか? – cpplearner
@cpplearnerすでにFooのインスタンス化のための型減算があります。私は控除ガイドのための利点を見ないか、または私は何かが欠けている? –