gpt4 book ai didi

c++ - SFINAE成员函数存在性测试问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:25:57 25 4
gpt4 key购买 nike

我有这个成员函数测试:

template <typename T> 
struct has_member {
template <typename U> static true_type f(decltype(declval<U>().member()) *);
template <typename> static false_type f(...);
static const bool value = decltype(f<T>(0))::value;
};

如果存在具有给定名称的成员函数,并且该函数具有不带参数的重载,则它的计算结果为 true。对于此类函数以及在 STL 容器的情况下,它可以正常工作,但元素访问函数(前面、后面等)除外,在这些函数中它总是计算为 false。

这是为什么呢?我有 mingw g++ 4.7。

最佳答案

那是因为这些函数返回引用,而你声明的是指向返回值的指针,即指向引用的指针,这是不可能的。

快速修复是:

template <typename U>  static true_type  
f(typename remove_reference< decltype(declval<U>().member()) >::type *);

PS:如果您强制编译器在 SFINAE 失败但您认为不应该出现错误时给出错误,则此类错误可能(相对)容易解决。

我的意思是,在您的代码中,只需注释掉 false_type 并在 true_type 是唯一选项时查看编译器的错误。在一堆毫无意义的行之间有以下内容:

test.cpp:9:50: error: forming pointer to reference type
‘__gnu_cxx::__alloc_traits<std::allocator<int> >::value_type& {aka int&}’

关于c++ - SFINAE成员函数存在性测试问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11273184/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com