は、我々はこのようなクラスのテンプレートがあるとしましょうさコンパイラが::close
のこの情報を知ることができるので、<int(int)>
を省略する方法はありますか?テンプレートの「デザイン」を保存する必要はありません。控除
具体的なタスクとしては、クラスのテンプレートを設計する必要があります。このクラスのオブジェクトは、構築時にこの関数の関数とパラメータを取り、この関数を後で呼び出すことができます。
は、我々はこのようなクラスのテンプレートがあるとしましょうさコンパイラが::close
のこの情報を知ることができるので、<int(int)>
を省略する方法はありますか?テンプレートの「デザイン」を保存する必要はありません。控除
具体的なタスクとしては、クラスのテンプレートを設計する必要があります。このクラスのオブジェクトは、構築時にこの関数の関数とパラメータを取り、この関数を後で呼び出すことができます。
いいえ、あなた(現在)はできません。
template<typename F, typename... Args>
A<std::decay_t<F>> make_A (F &&f, Args&&... args) {
return {std::forward<F>(f), std::forward<Args>(args)...};
}
C++ 17あなたは正確にあなたがやりたいことができますtemplate argument deduction for classをご紹介します。これを行うための標準的な方法は、「make_like」機能(のようなmake_pair
、make_optional
を...)を作成することです。あなただけに工場を書く必要があります、その前に
A a(::close, 1);
:C++ 17でコンストラクタのテンプレートパラメータ控除の採用に
テンプレートクラスの引数を省略することはできません。あなたができることは、引数を推論し、この引数をテンプレートクラスに転送し、適切なインスタンス化のオブジェクトを返すmaker関数を持つことです。
template<typename F, typename... Args>
A<F> make_A(F f, Args&&... args) {
return A<F>(f, std::forward<Args>(args)...);
}
おかげで、あなただけ書くことができるようになります - RVOのおかげで、ここで作られた全くのコピーは存在しません
template <class F, class... Args>
A<std::decay_t<F>> make_a(F&& f, Args&&... args) {
return {std::forward<F>(f), std::forward<Args>(args)...};
}
auto a = make_a(::close, 1);
これは少し冗長ですが、少なくともあなたは、効率を心配する必要はありません:あなたのための控除を行います。
Re:C++ 17:それはとても奇妙です。少なくともA
これらのファクトリ関数を作成する適切な方法は 'std :: decay'または' A 'の同様の特性を使うことです。これは 'A >'になります。 http://en.cppreference.com/w/cpp/utility/optional/make_optionalまたは他の 'make_ *'リファレンスを参照してください –
KABoissonneault
@KABoissonneaultはい、あなたが正しいです、もし私が普遍的な参照を使用しているなら 'std :: decay'私は答えを更新しました。 – Holt
私はその質問を理解できませんでした。全体の目標は 'auto a(:: close、1)'と言うことができるのでしょうか? – Assimilater