У меня есть класс, который в основном управляет только вектором пользовательских типов. Для того, чтобы избавить меня от написания той же итерации цикла снова и снова я написал следующую конструкцию:Как вывести возвращаемый тип объекта std :: bind для использования шаблона?
template<typename T>
uint64_t ACCUMULATE_ON_VECTOR(const std::vector<MyClass*> vec, T method)
{
return std::accumulate(vec.begin(), vec.end(), 0, [&](uint64_t acc, const MyClass* c)
{
return acc + (c ? method(c) : 0);
});
}
которая затем вызывается так:
ACCUMULATE_ON_VECTOR(_myVec, std::bind(&MyClass::someMethod, std::placeholders::_1));
Это работает очень хорошо в концепции, но так как у меня много методов, возвращающих разные целые типы (signed/unsigned, signed/unsigned long), я бы хотел отвлечься от hardcoded uint64_t, потому что я получаю предупреждения компилятора повсюду. Для этого мне как-то нужно получить возвращаемый тип объекта bind. Могу ли я как-то это сделать с помощью decltype? То, что я ищу это:
template<typename T>
<new deduced type> ACCUMULATE_ON_VECTOR(const std::vector<MyClass*> vec, T method)
{
return std::accumulate(vec.begin(), vec.end(), 0, [&](<new deduced type> acc, const MyClass* c)
{
return acc + (c ? method(c) : 0);
});
}
ли это необходимость работать с C++ 11, или C++ 14 нормально? Если это так, вы можете использовать 'auto'. – Michael
Может ли ['result_of'] (http://en.cppreference.com/w/cpp/types/result_of) вам помочь? –