V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zhiqiang
V2EX  ›  C

C++ SNINAE 如何判断指定函数是否存在?

  •  
  •   zhiqiang · 2018-08-13 16:52:11 +08:00 · 2755 次点击
    这是一个创建于 2054 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我要对每个有std::string to_string(T)函数的类型 T,都自动定义std::cout << T(实现为std::cout << to_string(T))。

    BOOST_TTI_HAS_MEMBER_FUNCTION可以检查类是否有指定成员函数,但我没找到如何检查是否有普通函数。

    9 条回复    2018-12-13 18:00:50 +08:00
    GeruzoniAnsasu
        1
    GeruzoniAnsasu  
       2018-08-13 17:27:46 +08:00
    没太懂,感觉你这个需求十分奇怪

    对于每个不同的 T,必然要实现不同的 to_string(T) ,那实现的时候顺便定义 operator<<(std::cout,T) 不就好了?
    zhiqiang
        2
    zhiqiang  
    OP
       2018-08-13 17:39:26 +08:00
    @GeruzoniAnsasu 有多个 T,单写一个还比较麻烦。

    另外我是对每个类 T,自动实现`vector<T>, map<T>, set<T>`等一大堆类型的`to_string`。那每个类型就要手工写四个`operator<<(std::cout,T_T)`。
    bilosikia
        3
    bilosikia  
       2018-08-13 17:57:37 +08:00
    首先是 SFINAE, 不是 SNINAE
    其实你的需求是要实现重载<<操作符
    geelaw
        4
    geelaw  
       2018-08-13 18:22:20 +08:00   ❤️ 1
    类似 enable_if_t 的用法,自己实现一个不就行了。

    https://gist.github.com/GeeLaw/a93e60f05c0257278f36b199d9987f53
    GeruzoniAnsasu
        5
    GeruzoniAnsasu  
       2018-08-13 18:43:53 +08:00   ❤️ 1
    其实我感觉

    template <typename T, typename I = decltype(to_string(T()))>
    decltype(std::cout << 1) operator<<(decltype(std::cout << 1) cout, const T &t)
    {
    return cout << to_string(t);
    }

    就行?

    对于没有定义 to_string(T)的 T,decltype 会失败
    AngelCriss
        6
    AngelCriss  
       2018-08-13 18:48:55 +08:00 via Android
    指定成员函数也是要给函数签名的啊,要不然给个函数名就行,那就是编译期反射了
    Bladeindark
        7
    Bladeindark  
       2018-08-14 07:22:09 +08:00
    ……都知道 SNINAE 了,外网不是大把这种 blog 么?
    codehz
        8
    codehz  
       2018-08-16 10:46:03 +08:00
    几天前还看到有这样的骚操作 https://zhuanlan.zhihu.com/p/41922937
    可以模拟 concept 的 requires
    429839446
        9
    429839446  
       2018-12-13 18:00:50 +08:00
    nlohmann/json 的 readme
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3981 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 10:20 · PVG 18:20 · LAX 03:20 · JFK 06:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.