2016-11-18 4 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 существует в возвращаемом типе моей функции указателя, который является параметром шаблона F (Я использую зЬй :: mem_fn создать его позже F также может быть std :: function), в настоящее время мне нужно явно передать тип U компилятору.

Как я могу использовать мой старый компилятор Vs2010 для вывода типа U?

+1

Вы не можете. Типы возврата не выводятся сами по себе. – NathanOliver

+2

Я обманул конкретный стандартный тег. Я не уверен, что это легко разрешимо в C++ 03. – Bathsheba

+0

Вы не можете в C++ 03, вы могли бы, вероятно, в C++ 14 с 'decltype (auto)' – 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 и trailing return. Они оба являются функциями C++ 11, но, согласно MSDN, они должны поддерживаться Visual Studio 2010. Для извлечения 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

Это правильно в принципе, но чтобы обойти ограничения VS2010 на 'decltype', вам может понадобиться отдельный признак для извлечения' element_type'. Я считаю, что не нравится использовать '::' с 'decltype' в качестве оператора LHS. – Angew

Смежные вопросы