请考虑以下代码:
// 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;
}
这是一个旨在比较两个容器的全局函数。
我不明白该功能的原型。什么是equals_op_type
?
另外,equals_op_type<typename Container1::value_type, typename Container2::value_type>
的目的是什么?
我很感激你的帮助,因为我是模板概念的新手。
由于
答案 0 :(得分:2)
我不明白该功能的原型。什么是
equals_op_type
?
你的意思是
template<typename T1, typename T2>
using equals_op_type = decltype(std::declval<T1>() == std::declval<T2>());
它不是功能原型;它定义了一种类型(T1{} == T2{}
的结果类型,粗略地说应该是bool
,但是只有 如果 {{1 }}和T1
具有可比性。
所以,当你定义函数
时T2
它变成了
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_type
是可比类型;替换失败(因此运算符未实现但没有编译错误)否则。
这种操作方式使用与首字母缩略词SFINAE合成的规则:替换失败不是错误。
它在现代c ++中的模板编程中起着重要作用。我建议你研究它。