Как получить возвращаемый тип метода параметра шаблона?
Я пытаюсь создать класс шаблона, который ожидает лямбда в качестве входных данных, сохраняет его, а также сохраняет в
vector
некоторые элементы
type = return type
лямбды. Но я не знаю, как получить этот тип, хотя при построении экземпляра лямбда известна также с типом возвращаемого значения.
Я бы хотел, чтобы класс был построен без указания параметров шаблона (например,
std::array a{1, 2, 3}
). я пробовал с
decltype(F::operator(double x))
но это не работает.
#include <vector>
template<typename F>
struct Foo {
using value_t = decltype(F::operator(double x))// <--- here I need to get the return type of the
// call operator of F!
Foo(const F& f) : _f(f), _vals(10, value_t{}), _has_vals(10, false) {}
value_t operator()(int i) {
if (_has_vals[i])
return _vals[i];
else {
_has_vals[i] = true;
_vals[i] = _f(i);
}
}
F _f;
std::vector<value_t> _vals;
std::vector<bool> _has_vals;
};
#include <iostream>
int main() {
Foo foo([](double x){ return 42; }); // <--- here I know that the lambda returns an int!
std::cout << foo(3) << "\n";
return 0;
};
1 ответ
decltype
требуется фактическое выражение вызова, чтобы получить возвращаемый тип, который вы не можете действительно надежно получить из типа (поскольку, например, тип может не быть конструируемым по умолчанию).
Вы должны использоватьstd::declval
"создать" экземпляр
F
что вы можете позвонить.
Возможно, что-то вроде
using value_t = decltype(declval<F>()(0.0));