Отказ от ответственности: Я видел this question, и я точно спрашиваю, как decltype
, предложенный в принятом ответе, может быть использован для этого.Как правильно вывести тип возврата для шаблона?
В основном я стараюсь (немного для удовольствия, немного для удобства и немного для учебной цели) для реализации небольших оберток для стандартных алгоритмов, которые упрощают их использование при применении ко всему контейнеру. Основная идея состоит в том, чтобы избавиться от .begin()
и .end()
и просто указать контейнер, на котором должен применяться алгоритм.
Затем я хотел бы узнать, возможно ли это (и не глупо, кстати) вывести возвращаемый тип моих оберток из самого типа возвращаемого стандартного алгоритма.
На данный момент, я попробовал следующее (для станд :: подсчет):
template<class Cnt,
class T>
inline
auto count(Cnt _cnt, const T& _val) -> decltype(std::count){}
, но он дал мне ошибку во время компиляции:
Не удалось специализировать шаблон функции «» неизвестный тип «ragut :: Количество (НСТ, сопзЬ T &)»
Я полагал, что это не может быть достаточно, чтобы просто сказать decltype(std::count)
, и предположил, что это, как ked для более указанного аргумента:
decltype(std::count<std::iterator<std::input_iterator_tag,Cnt::value_type> >)
, но это дало ту же ошибку.
Я хотел бы знать, если это на самом деле не глупо и возможно сделать это.
Вы, вероятно, хотите, чтобы передать контейнер по константной ссылке. – MSalters
@MSalters Правильно, хорошо, спасибо! – JBL
Хорошо, что в C++ 14 мы, вероятно, сможем оставить тип возвращаемого возврата. Компилятор определит это из 'return std :: count (std :: begin (_cnt), std :: end (_cnt), _val);'. – MSalters