大佬教程收集整理的这篇文章主要介绍了c – 是否有通用的方法来消除SFINAE的decltype条件?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
template <class A,class B> void foo(A& a,B& b) { cout << "generic fallBACk" << endl; } template <class A> void foo(A& a,int &i) { cout << "generic int" << endl; } template <class A> void foo(A& a,String& s) { cout << "generic str" << endl; }
我想创建一个重载,只要A是特定结构的实例[1]就会调用它.到目前为止我想出的最好的是:
struct mine { int is_special; }; template <class A,class B> auto foo(A& a,B& b) -> decltype(A::is_special,void()) { cout << "specialized fallBACk" << endl; }
我想要的结果是:
int x; String y; float z; String generic; mine special; foo(generic,X); // generic int foo(generic,y); // generic String foo(generic,z); // generic fallBACk foo(special,X); // specialized fallBACk foo(special,y); // specialized fallBACk foo(special,z); // specialized fallBACk
但是,上面的代码不起作用,因为对于特殊情况,存在模糊的重载.如果A :: is_special不是有效类型,是否有任何简单的方法可以使这些函数只被创建?理想情况下,我会用以下内容注释每个函数:
template <class A,B& b) -> decltype(doesnt_work(A::is_special),void()) // ...
在更一般的情况下,我也要问:鉴于任何“正面”SFINAE测试会导致测试结果导致函数或类被创建,是否有任何方法可以否定该测试专门用于其他情况?实质上,相当于if … else与SFINAE相同.
我确实得到了这个案例,但是我必须将所有foo重命名为foo_imp,将一个long参数添加到泛型参数,将一个int参数添加到专用的参数,然后定义一个调用它们的foo(ideone代码here).这似乎不太理想,因为它不是那么简单,尽管无论如何我必须修改所有现有的foos.
您可以使用额外参数手动控制重载决策:
template<int I> struct rank : rank<I-1> { static_assert(I > 0,""); }; template<> struct rank<0> {}; template <class A,B& b,rank<10>) -> /*some SFINAE */ { } template <class A,rank<9>) -> /* some other SFINAE */ { } // ... template <class A,rank<0>) { // fallBACk } template <class A,B& b) { return foo(a,b,rank<20>()); }
具有最高“等级”的可行过载将通过过载分辨率来选择.
您不能直接否定临时SFINAE约束(“签名中使用的此表达式必须格式良好”).您需要编写一个实际特征来检测它,然后否定结果.最简单的方法是使用std::experimental::is_detected_v
,最近投入了库基础知识TS的v2:
template<class T> using is_special_t = decltype(T::is_special); template <class A,B& b) -> std::enable_if_t<!std::experimental::is_detected_v<is_special_t,A>> { cout << "generic fallBACk" << endl; } template <class A,class B> auto foo(A& a,B& b) -> std::enable_if_t<std::experimental::is_detected_v<is_special_t,A>> { cout << "specialized fallBACk" << endl; }
以上是大佬教程为你收集整理的c – 是否有通用的方法来消除SFINAE的decltype条件?全部内容,希望文章能够帮你解决c – 是否有通用的方法来消除SFINAE的decltype条件?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。