3

快速提问。如果我有一个函数签名,比如

template <typename T, typename ItType>
ItType binarySearch ( T mid, ItType first, ItType last );

反正有没有做类似以下的事情?我知道这种语法不正确,但你明白了,因为我可以做一个与常规函数类似的 decltype,见下文。编译器在编译时就知道 ItType 的类型,所以它不应该也能推断出 *ItType 的类型吗?

template <typename ItType>
ItType binarySearch ( decltype(*ItType) mid, ItType first, ItType last );


// lambda
auto p = v.begin() + (v.end() - v.begin())/2;
std::partition ( v.begin(), v.end(), [p](decltype(*p) i) { return i < *p; } )
4

1 回答 1

1

问题与

decltype(*ItType)

*ItType不是一个有效的表达式。一种天真的方法可能如下所示:

decltype(*ItType())

如果 ItType是默认可构造的,这将起作用。由于您不想强制执行此操作,因此可以使用std::declval“调用”一个假装返回以下实例的函数ItType

decltype(*std::declval<ItType>())

此函数仅被声明但从未定义,这意味着您不能真正调用它,但这并不重要,因为您在 中使用它decltype(),这是一个未评估的上下文。

于 2013-11-01T22:56:02.347 回答