【发布时间】:2020-03-17 16:05:17
【问题描述】:
假设我必须遵循以下功能:
template <typename Op, typename T> T foo(Op op) { }
Op假设有如下方法:
T Op::operator()(T&);
(这是一个简单的案例;实际上它可能有更多参数,但我知道它们的类型)。
现在,我想为T 参数设置一个默认值。问题是,为了虚假调用它(例如std::result_of<Op::operator()(int&)>,我需要有参数的类型——这正是我所缺少的类型。
是否可以从Op 中确定T?例如,我可以调用:
foo( [](int& x){ return x++; } );
我对 C++11 解决方案感兴趣;如果您需要更高标准版本的功能,那也很有趣(尤其是解释为什么会这样)。
注意:如果Op 我自己有多个兼容的 operator()'s taking references to different types, I'm ok with having to specifyT`,当然 - 但是当我这样做时编译应该会通过。
【问题讨论】:
-
应该
foo(Op op) { }是T foo(Op op) { }? -
另外,你真的需要知道
T吗?可以使用auto返回类型推导。 -
既然函数以function作为参数,那么回调的参数从何而来?恕我直言,这在这里至关重要
-
如果函数对象有多个不同返回类型的重载怎么办?
-
@NathanOliver:1. 是的。 2. 是的,因为没有它,我无法调用 Op。还有其他原因不在此示例中。
标签: c++ c++11 templates type-deduction return-type-deduction