Как получить возвращаемый тип метода параметра шаблона?

Я пытаюсь создать класс шаблона, который ожидает лямбда в качестве входных данных, сохраняет его, а также сохраняет в 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));
Другие вопросы по тегам