通过比较两个容器的例子来理解模板原型

时间:2017-09-23 11:29:45

标签: c++ c++11 templates sfinae decltype

请考虑以下代码:

// 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>的目的是什么?

我很感激你的帮助,因为我是模板概念的新手。

由于

1 个答案:

答案 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 ++中的模板编程中起着重要作用。我建议你研究它。