如何获得模板参数方法的返回类型?



我正在尝试制作一个模板类,期望lambda作为输入,存储它,并且还存储在vectortype = return type的一些元素中。但是我不知道如何获得该类型,即使在构建实例时,lambda也知道其返回类型。

我想在没有给出模板参数(如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;
};

decltype需要一个实际的调用表达式来获得返回类型,您无法真正可靠地从类型F中获得返回类型(因为类型F可能不是默认可构造的)。

必须使用std::declval来"创建";一个F的实例,你可以调用它。

也许像

using value_t = decltype(declval<F>()(0.0));

相关内容

  • 没有找到相关文章

最新更新