Недавно я работал с другом, который хотел сделать C ++ более Haskell-y, и мы хотели функцию, которая в основном похожа на эту:
auto sum(auto a, auto b) {
return a + b;
}
Очевидно, я не могу использовать auto в качестве типа параметра, поэтому я изменил его на:
template<class A, class B>
auto sum(A a, B b) {
return a + b;
}
Но это тоже не работает. То, что мы в конце концов поняли, нам нужно это:
template<class A, class B>
auto sum(A a, B b) -> decltype(a + b) {
return a + b;
}
Итак, мой вопрос, какой смысл? Разве decltype
не просто повторяет информацию, так как компилятор может просто посмотреть на оператор return?
Я подумал, что, возможно, это необходимо, поэтому мы можем просто включить заголовочный файл:
template<class A, class B>
auto sum(A a, B b) -> decltype(a + b);
... но мы все равно не можем использовать такие шаблоны.
Еще одна вещь, которую я рассмотрел, заключалась в том, что это может быть проще для компилятора, но кажется, что на самом деле это будет сложнее.
Случай 1: С decltype
- Определите тип оператора
decltype
- Определить типы любых возвращаемых значений
- Проверьте, соответствуют ли они
Случай 2: без decltype
- Определить типы любых возвращаемых значений
- Проверьте, соответствуют ли они
Итак, с учетом всего этого, какой смысл в конце типа возврата с decltype
?