gpt4 book ai didi

c++ - 通过比较两个容器的例子理解模板原型(prototype)

转载 作者:行者123 更新时间:2023-11-28 01:43:06 24 4
gpt4 key购买 nike

考虑以下代码:

// get the return type of == for T1 and T2
template<typename T1, typename T2>
using equals_op_type = decltype(std::declval<T1>() == std::declval<T2>());

template <class Container1, class Container2>
equals_op_type<typename Container1::value_type, typename Container2::value_type>
operator==(const Container1& c1, const Container2& c2) {
if(c1.size() != c2.size()) return false;
auto itr2 = c2.begin();
for(const auto& v : c1) {
cout << v << " == " << *itr2 << "? ";
if(v != *itr2++) return false;
}
return true;
}

这是一个全局函数,用于比较两个容器。

我不明白函数的原型(prototype)。什么是 equals_op_type确切地?

此外,equals_op_type<typename Container1::value_type, typename Container2::value_type> 的目的是什么? ?

非常感谢您的帮助,因为我是模板概念的新手。

谢谢

最佳答案

I don't understand the function's prototype. What is equals_op_type exactly?

你是说

template<typename T1, typename T2>
using equals_op_type = decltype(std::declval<T1>() == std::declval<T2>());

?

它不是函数原型(prototype);它定义了一个类型(T1{} == T2{} 的结果类型,粗略地说,显然应该是 bool)但 如果 T1T2 具有可比性。

所以,当你定义函数的时候

template <class Container1, class Container2>
equals_op_type<typename Container1::value_type, typename Container2::value_type>
operator==(const Container1& c1, const Container2& c2) {
// function code
return true; // or false
}

变成

template <class Container1, class Container2>
bool
operator==(const Container1& c1, const Container2& c2) {
// function code
return true; // or false
}

如果 Container1::value_typeContainer2::value_type 是可比较的类型;否则替换失败(因此运算符未实现但没有编译错误)。

这种操作方式使用由首字母缩略词 SFINAE 合成的规则:替换失败不是错误。

它在现代c++的模板编程中扮演着重要的角色。我建议你研究它。

关于c++ - 通过比较两个容器的例子理解模板原型(prototype),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46379102/

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