C++ 通过比较两个容器的示例了解模板原型

C++ 通过比较两个容器的示例了解模板原型,c++,c++11,templates,sfinae,decltype,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<

考虑以下代码:

// 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;
}
//获取T1和T2的返回类型==
模板
使用equals_op_type=decltype(std::declval()==std::declval());
模板
等于op类型
运算符==(常量容器1和c1,常量容器2和c2){
如果(c1.size()!=c2.size())返回false;
自动itr2=c2.begin();
用于(常数自动和v:c1){
库特
我不理解函数的原型。确切地说,
equals\u op\u type
是什么

你是说

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

template <class Container1, class Container2>
bool
operator==(const Container1& c1, const Container2& c2) {
    // function code
    return true; // or false
}
模板
布尔
运算符==(常量容器1和c1,常量容器2和c2){
//功能代码
返回true;//或false
}
如果
Container1::value_type
Container2::value_type
是可比较的类型,则替换失败(因此未实现运算符,但没有编译错误)

这种操作方式使用了以首字母缩写SFINAE合成的规则:替换失败不是错误

在现代C++中的模板编程中起着重要作用。 我不理解函数的原型。确切地说,

equals\u op\u type
是什么

你是说

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

template <class Container1, class Container2>
bool
operator==(const Container1& c1, const Container2& c2) {
    // function code
    return true; // or false
}
模板
布尔
运算符==(常量容器1和c1,常量容器2和c2){
//功能代码
返回true;//或false
}
如果
Container1::value_type
Container2::value_type
是可比较的类型,则替换失败(因此未实现运算符,但没有编译错误)

这种操作方式使用了以首字母缩写SFINAE合成的规则:替换失败不是错误


在现代C++中的模板编程中起着重要作用。我建议您研究一下。< /P>我知道。谢谢您的详细回答。现在看来很明显:)基本上,<代码> ValueSype类型< /C>防止非容器类型进入这个函数,对吗?(即代码> 3==4 < /代码>)@cppn00b-基本上;如果传递的类型之一不包含名为

value\u type
的类型,则会出现替换失败。我明白了。感谢您提供的详细答案。现在看起来很明显:)因此基本上
value\u type
可以防止非容器类型进入此函数,对吗?(即
3==4
)@cppn00b-基本上;如果传递的类型之一不包含名为
value\u type
的类型,则存在替换失败。您的问题没有什么意义,因为代码包含解释
equals\u op\u type
的目的的注释。因此,您问题的答案正是上述代码中的第一条注释://获取回复对于T1和T2,将类型转换为==你的问题没有什么意义,因为代码中包含了一条注释,解释了
equals_op_type
的用途。因此,你的问题的答案正是上述代码中的第一条注释://获取T1和T2的返回类型==。