SFINAE無法正確判斷方法是否存在

我試圖復制(我猜)典型的SFINAE示例來判斷一個類型是否有特定的方法。我的代碼基本上就是之前一個熱門問題的公認答案:

#include <iostream>
#include <vector>
#include <set>
#include <map>
#include <list>

template <typename T>
class has_push_back_sfinae {
    typedef int8_t yes;
    typedef int16_t no;

    template <typename C> static constexpr yes test(decltype(&C::push_back));
    template <typename C> static constexpr no test(...);    

 public:
    static constexpr bool value = (sizeof(test<T>(0)) == sizeof(yes));
};

template <typename T>
constexpr bool has_push_back = has_push_back_sfinae<T>::value;

int main() {
    std::cout << std::boolalpha;
    std::cout << has_push_back<int> << std::endl;
    std::cout << has_push_back<std::set<int>> << std::endl;
    std::cout << has_push_back<std::map<int, char>> << std::endl;
    std::cout << has_push_back<std::vector<char>> << std::endl;
    std::cout << has_push_back<std::list<int>> << std::endl;
    std::cout << has_push_back<std::string> << std::endl;
    return 0;
}

基本上,has_push_back<T>意味著true當且僅當push_backT的方法。我希望我的輸出有3行false,后面是3行true。但是,這是實際輸出:

false
false
false
false
false
true

我錯過什么了嗎?

(附言:有沒有更標準或更好的方法來編寫這樣一個類?)

? 最佳回答:

此方法僅適用于non-overloaded函數。如果它重載了,就不能對它進行pointer-to-member,除非您立即將它轉換為特定的指針類型。

這種類型轉換是error-prone,因此我建議嘗試調用函數:

/*...*/ constexpr yes test(decltype(void(
    std::declval<C &>().push_back(std::declval<const typename C::value_type &>())), int{}));

在國際海事組織看來,在相關的答復中所建議的SFINAE方法是不必要的冗長。我會這么做:

template <typename T, typename = void> struct has_push_back_sfinae : std::false_type {};
template <typename T> struct has_push_back_sfinae<T,
    decltype(void(std::declval<T &>().push_back(std::declval<const typename T::value_type &>())))
> : std::true_type {};
template <typename T> inline constexpr bool has_push_back = has_push_back_sfinae<T>::value;
主站蜘蛛池模板: 久久精品一区二区三区日韩| 欧洲无码一区二区三区在线观看| 日韩精品无码视频一区二区蜜桃 | 国产综合视频在线观看一区 | 午夜精品一区二区三区在线视| 精品国产鲁一鲁一区二区| 插我一区二区在线观看| 日本福利一区二区| 亚洲丶国产丶欧美一区二区三区| 另类ts人妖一区二区三区| 在线播放一区二区| 无码人妻精品一区二区三区66 | 中文字幕一区二区三区在线观看 | 伊人色综合网一区二区三区| AV无码精品一区二区三区| 亚洲A∨精品一区二区三区下载| 无码人妻一区二区三区av| 亚洲一区二区女搞男| 国产精品污WWW一区二区三区| 国语精品一区二区三区| 中文字幕精品亚洲无线码一区应用| 精品视频一区二区三区在线观看| AV无码精品一区二区三区| 丰满人妻一区二区三区视频| 精品不卡一区中文字幕| 日本精品一区二区久久久| 国产精品被窝福利一区 | 波多野结衣一区二区三区aV高清| 国产在线一区二区| 亚洲欧美成人一区二区三区 | 高清一区二区三区免费视频| 国产精品福利一区二区久久| 日韩精品区一区二区三VR| 日本一区二区三区四区视频| 精品国产日韩亚洲一区在线| 国产在线一区二区三区在线| 日本中文字幕在线视频一区| 亚洲AV无码一区二区三区在线| 深夜福利一区二区| 国产av熟女一区二区三区| 国产女人乱人伦精品一区二区 |