2016-11-18 15 views
3

私はそのパラメータの戻り値の型から関数の戻り値の型を推測

template<typename U, typename F > 
U GetListAndSearchName(F listGetter, const std::string& stringName) 
{ 
    std::vector<UserType> newList; 
    for (size_t i = 0; i < myList.size(); i++) 
    { 
     const std::vector<U>& list = listGetter(myList[i]); 
     for (size_t i = 0; i < list.size(); i++) 
     { 
      if (list[i]->GetName() == stringName) 
       return list[i]; 
     } 
    } 
    return U(); 
} 

以下のコードはさえUは(私はそれを作成するためのstd :: mem_fnのを使用していますテンプレートパラメータがFである私の関数ポインタの戻り値の型に存在してい後でFもstd :: functionとなる可能性があります)現在、Uの型をコンパイラに明示的に渡す必要があります。

Uの型を推定するために古いVs2010コンパイラを使用するにはどうすればよいですか?

+1

あなたがすることはできません。戻り値の型はそれ自身では推論できません。 – NathanOliver

+2

私は特定の標準タグを乱用しました。私はこれがC++ 03で簡単に解けるかどうかはわかりません。 – Bathsheba

+0

あなたはC++ 03ではできません。おそらく 'decltype(auto) 'を持つC++ 14でしょう。 – 101010

答えて

6

2010年の作品:

template<typename F> 
auto GetListAndSearchName (F listGetter, const std::string& stringName) 
    -> decltype(listGetter(myList[0])[0]) 
+0

ニース。 '::'問題を丸めます。 – Bathsheba

+0

リストが空の場合どうなりますか –

+1

@KadirErdemDemir 'decltype'内の式は評価されないので、何も起こりません。 –

4

decltypeと末尾の戻り値の型を使用する必要があります。これらはどちらもC++ 11の機能ですが、MSDNによればVisual Studio 2010でサポートされるはずです。また、vectorからvalue_typeを抽出するには型特性が必要です。

template<typename T> 
struct value_type { typedef T::value_type type; }; 

template<typename F> 
auto GetListAndSearchName(F listGetter, const std::string& stringName) 
    -> typename value_type<decltype(listGetter(myList[0]))>::type 
+0

原則は正しいですが、 'decltype'のVS2010の制限を回避するには、' element_type'を抽出するために別の特性が必要になるかもしれません。私はLHS演算子として '::'と '' decltype'を使うのが好きではないと思います。 – Angew