gpt4 book ai didi

c++ - 如何正确地将比较器传递给另一个模板函数

转载 作者:太空狗 更新时间:2023-10-29 23:32:27 24 4
gpt4 key购买 nike

我需要一个函数,它将采用两个迭代器和一个自定义比较器来比较此迭代器的值。我不想为此使用额外的模板参数。我是这样实现的:

template<typename T>
void foo(T begin, T end,
function<bool(decltype(*begin), decltype(*begin))> compare = less<decltype(*begin)>())
{
// I want to use 'compare' as: "compare(*begin, *begin);"
}

此代码已由 clang 正常编译,但在 GCC 5.4.0 上出现了一些错误:

binary_heap.cpp:10:79: error: local variable 'begin' may not appear in this context
function<bool(decltype(*begin), decltype(*begin))> compare = less<decltype(*begin)>())
^
binary_heap.cpp:10:85: error: template argument 1 is invalid
function<bool(decltype(*begin), decltype(*begin))> compare = less<decltype(*begin)>())

如何更正此代码,以便它可以在 clang 和 GCC 上成功编译?或者是否有更合适的解决方案来定义此类功能?

最佳答案

您不能在默认参数中使用参数,即使在未计算的上下文中也是如此(尽管可能应该修改标准以放宽该限制)。代替 decltype(*begin),使用

decltype(*std::declval<T&>())

编辑:实际上,这可能不会做您想要的,因为如果应用 * 运算符产生一个左值,那么 decltype 说明符将解析为左值引用,但您可能希望将未引用的类型作为 std::less 的参数。更好用:

typename std::iterator_traits<T>::value_type

编辑 2: 我同意 krzaq,最好只添加另一个模板参数。

关于c++ - 如何正确地将比较器传递给另一个模板函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40162177/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com