快速提问。如果我有像
这样的功能签名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; } )
答案 0 :(得分:1)
的问题
decltype(*ItType)
是*ItType
不是有效的表达式。一个天真的方法可能是这样的:
decltype(*ItType())
如果 ItType
是默认可构造的,将起作用。由于您不想强制执行,您可以使用std::declval
“调用”假装返回ItType
实例的函数:
decltype(*std::declval<ItType>())
此函数仅被声明但从未定义,这意味着您无法真正调用它,但这并不重要,因为您在decltype()
中使用它,这是一个未评估的上下文。