gpt4 book ai didi

c++ - 使用模板元编程 C++ 比较 2 个值

转载 作者:搜寻专家 更新时间:2023-10-31 00:51:59 25 4
gpt4 key购买 nike

我想要一个默认函数作为“Predicate”模板,以防用户不提供。到目前为止,我一直在做类似的事情:

template<typename T>
struct simple_compare{
bool operator()(T const& a, T const& b){
return a > b;
}
};

template<typename T, typename Predicate=simple_compare<T> >
bool compare(T a, T b, Predicate pred) {
return pred(a, b);
}

这可以使用 C++ 中的模板元编程来完成,而不是使用带有重载 () 运算符的结构吗?

最佳答案

这里不需要模板元编程。您可以简单地使用重载,如 Davide Spataro 的答案中所示,以提供一个不采用谓词的版本,只需使用默认谓词调用完整版本。或者您可以只为谓词使用默认参数:

template <typename T, typename Predicate = simple_compare<T>>
bool compare(T a, T b, Predicate pred = {}) {
return pred(a, b);
}

如果您只想要一个调用 > 运算符的通用仿函数,那么您也可以只制作 operator ()一个模板而不是仿函数类型本身,并从调用中推导出要比较的确切类型:

struct simple_compare {
template <typename A, typename B>
bool operator()(A const& a, B const& b) const {
return a > b;
}
};

template <typename T, typename Predicate = simple_compare>
bool compare(T a, T b, Predicate pred = {}) {
return pred(a, b);
}

另外,标准库已经提供了standard functors用于调用各种运算符。因此,与其自己滚动,不如使用 std::greater<T> std::greater<void> 在你的例子中。此外,我认为没有必要要求您的参数可复制且类型相同:

template <typename A, typename B, typename Predicate = std::greater<void>>
bool compare(A const& a, B const& b, Predicate pred = {}) {
return pred(a, b);
}

关于c++ - 使用模板元编程 C++ 比较 2 个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53445207/

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