c – SFINAE:删除具有相同原型的函数
发布时间:2020-12-16 03:26:17 所属栏目:百科 来源:网络整理
导读:我想知道这个代码有什么区别: #include type_traits#include iostreamtemplatetypename T using is_ref = std::enable_if_tstd::is_reference_vT,bool;templatetypename T using is_not_ref = std::enable_if_t!std::is_reference_vT,bool;templatetypename
我想知道这个代码有什么区别:
#include <type_traits> #include <iostream> template<typename T> using is_ref = std::enable_if_t<std::is_reference_v<T>,bool>; template<typename T> using is_not_ref = std::enable_if_t<!std::is_reference_v<T>,bool>; template<typename T,is_ref<T> = true> void foo(T&&) { std::cout << "ref" << std::endl; } template<typename T,is_not_ref<T> = true> void foo(T&&) { std::cout << "not ref" << std::endl; } int main() { int a = 0; foo(a); foo(5); } 而这个不起作用: #include <type_traits> #include <iostream> template<typename T> using is_ref = std::enable_if_t<std::is_reference_v<T>,typename = is_ref<T>> void foo(T&&) { std::cout << "ref" << std::endl; } template<typename T,typename = is_not_ref<T>> void foo(T&&) { std::cout << "not ref" << std::endl; } int main() { int a = 0; foo(a); foo(5); } typename = is_ref< T>之间的真正区别是什么?和is_ref< T> =真的吗? 解决方法
如果删除默认模板参数,则会清楚区别的是什么.函数声明只能在默认值上有所不同.这是不正确的:
void foo(int i = 4); void foo(int i = 5); 同样,这是不正确的: template <typename T=int> void foo(); template <typename T=double> void foo(); 考虑到这一点,你的第一个案例: template<typename T,is_ref<T>> void foo(T&&); template<typename T,is_not_ref<T>> void foo(T&&); 这里的两个声明是唯一的,因为第二个模板参数在两个声明之间不同.第一个具有非类型模板参数,其类型为std :: enable_if_t< std :: is_reference_v< T>,bool>第二个是非类型模板参数,其类型为std :: enable_if_t<!std :: is_reference_v< T>,bool>.那些是不同的类型. 然而,你的第二个案例: template<typename T,typename> void foo(T&&); template<typename T,typename> void foo(T&&) 这显然是相同的签名 – 但我们只是重复它.这是不正确的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |