Предположим, что у меня есть функция, которая объединяет два значения. Если я ничего не знаю о типах, то в основном я должен написать свою функцию дважды; один раз в действительном возвращаемом значении и снова в качестве спецификатора типа возврата:
template <typename A, typename B>
auto Add(const A& a, const B& b) ->std::decay<decltype(a + b)>::type
{
return a + b;
}
Пока это работает, это нежелательно, потому что его трудно читать и трудно поддерживать.
В С++ 14 это не будет проблемой, потому что мы можем удалить спецификатор типа возвращаемого значения (я не уверен, что это сделает распад, хотя...). Пока что я застрял с С++ 11.
По моему опыту, когда я ищу функцию на С++, которая еще не пробилась в стандарт, но для которой существует очевидная потребность, Boost library обычно имеет решение. Я просмотрел документацию, но я не нашел ничего, что могло бы мне помочь. Функции BOOST_AUTO_RETURN
и BOOST_TYPEOF_TPL
кажутся более нацеленными на предоставление возможностей С++ 11 пользователям С++ 03.
В основном, что мне нужно, это то, что выполняет следующие функции:
template <typename A, typename B>
auto Add(const A& a, const B& b)
{
return a + b; // Deduce return type from this, like C++14 would
}
Есть ли какая-то функциональность в библиотеке Boost, о которой я не знаю (или отличный трюк в С++ 11), который может позволить мне отказаться от явного -> decltype(...)
после каждого типа автоматического возврата? Как это будет реализовано?