假设我有以下示例功能:
template <typename Fn> auto call(Fn fn) -> decltype(fn()) {
return fn();
}
这个函数重要的是它的返回类型取决于它的模板参数,可以推断。所以最终,返回类型取决于函数的调用方式。
现在,我们还有一个测试类:
struct X {
int u;
auto test() -> decltype(call([this]() -> double {this->u = 5; return 7.4;})) {
return call([this]() -> double {this->u = 5; return 7.4;});
}
};
如您所见,X::test
调用call
,返回相同的返回值。在这种情况下,返回类型通常为double
,但让我们假设我们不知道是什么call
,并且 lambda 具有更复杂的返回类型。
如果我们尝试编译它,编译器会报错,因为我们this
在顶层使用(不在允许表达式的范围内):
error: lambda-expression in unevaluated context
error: invalid use of ‘this’ at top level
但是,我必须使用传递给的 lambda 的捕获call
来获得call
正确的返回类型。你会建议如何解决这个问题,同时仍然离开 lambda?
注意:当然,我可以将 lambda 移动operator()
为某种辅助类型,我用this
指针的副本对其进行实例化,但我想避免使用该样板。