为什么在没有-DPASS的情况下编译下面的测试用例是不友好的


$cat test.cc

#include <type_traits>
struct foo{
};

template<typename F,typename A>
struct other
{
template<typename f, typename a,
#ifndef PASS
typename = decltype(std::declval<F>()(std::declval<A>()))>
#else
typename = decltype(std::declval<f>()(std::declval<a>()))>
#endif
static std::true_type     _Fn(int);

template<typename...>
static std::false_type _Fn(...);

typedef decltype(_Fn<F,A>(0)) type;
};

int main() {
static_assert(std::is_same<std::false_type,other<foo&,int>::type>::value,"PASSED");
return 0;
}

Compilation command: 
g++ test.cc -std=c++11

为什么没有DPASS sfinae就不能在这里工作?我一直在努力编译原始的测试用例(没有-DPASS(,但我提出了解决方案(-D帕斯(,但无法理解其中的区别?

因为SFINAE与类方法相关,它处理方法本身的模板参数,而不是包含类的方法。

你可以绕过这个限制";变换";方法参数中的类参数,具有以下技巧

template <typename T>
struct foo
{
template <typename U = T,
typename = /* some test over U */>
void bar ();
// ...

这样,U是方法bar的模板参数,但具有类的模板参数T的相同类型。

相关内容

  • 没有找到相关文章

最新更新