控除

2016-07-06 15 views
31

は、我々はこのようなクラスのテンプレートがあるとしましょうさコンパイラが::closeのこの情報を知ることができるので、<int(int)>を省略する方法はありますか?テンプレートの「デザイン」を保存する必要はありません。控除

具体的なタスクとしては、クラスのテンプレートを設計する必要があります。このクラスのオブジェクトは、構築時にこの関数の関数とパラメータを取り、この関数を後で呼び出すことができます。

答えて

35

いいえ、あなた(現在)はできません。

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_pairmake_optionalを...)を作成することです。あなただけに工場を書く必要があります、その前に

A a(::close, 1); 

:C++ 17でコンストラクタのテンプレートパラメータ控除の採用に

+0

これらのファクトリ関数を作成する適切な方法は 'std :: decay'または' A 'の同様の特性を使うことです。これは 'A >'になります。 http://en.cppreference.com/w/cpp/utility/optional/make_optionalまたは他の 'make_ *'リファレンスを参照してください – KABoissonneault

+0

@KABoissonneaultはい、あなたが正しいです、もし私が普遍的な参照を使用しているなら 'std :: decay'私は答えを更新しました。 – Holt

+0

私はその質問を理解できませんでした。全体の目標は 'auto a(:: close、1)'と言うことができるのでしょうか? – Assimilater

11

テンプレートクラスの引数を省略することはできません。あなたができることは、引数を推論し、この引数をテンプレートクラスに転送し、適切なインスタンス化のオブジェクトを返すmaker関数を持つことです。

template<typename F, typename... Args> 
A<F> make_A(F f, Args&&... args) { 
    return A<F>(f, std::forward<Args>(args)...); 
} 
15

おかげで、あなただけ書くことができるようになります - 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); 

これは少し冗長ですが、少なくともあなたは、効率を心配する必要はありません:あなたのための控除を行います。

+1

Re:C++ 17:それはとても奇妙です。少なくともA a(:: close、1); 'と書く必要があるようです。私はそれに慣れるだろうと思うけど。 。 。 – ruakh

関連する問題