C++ 请解释以下C++;语法

C++ 请解释以下C++;语法,c++,C++,我将在这里介绍的代码最初是: 我确实读过关于SFINAE的文章,但这个例子对我来说仍然很不清楚。这些东西在文献中从未提及过 尽管我想对整个代码进行解释,但最令人困惑的是: static std::true_type _check(X&, Y&, decltype(std::declval<X>() + std::declval<Y>()) = {}); static std::true\u type检查(X&,Y&,decltype(std::decl

我将在这里介绍的代码最初是:

我确实读过关于SFINAE的文章,但这个例子对我来说仍然很不清楚。这些东西在文献中从未提及过

尽管我想对整个代码进行解释,但最令人困惑的是:

static std::true_type _check(X&, Y&, decltype(std::declval<X>() + std::declval<Y>()) = {});
static std::true\u type检查(X&,Y&,decltype(std::declval()+std::declval())={});
_检查静态成员函数是否包含3个参数

  • 第一个参数是对X类型的引用,它的意义是什么
  • 第二个参数是对Y类型的引用,它的意义是什么
  • decltype应该返回一个类型(我猜是结果X+Y的类型,不管是什么)。整个论点的重点是什么?它的结尾“={}”是什么意思
  • 编辑: 尽管我提供了原始代码的链接,但没有人关心它,因此这里有一个复制/粘贴:

    template<typename T, typename U>
    struct _has_plus_hlp {
        template<typename X, typename Y>
        static std::true_type _check(X&, Y&, decltype(std::declval<X>() + std::declval<Y>()) = {});
        static std::false_type _check(...);
    
        using type = decltype(_check(std::declval<T>(), std::declval<U>()));
    };
    template<typename X, typename Y>
    constexpr bool has_plus_v = _has_plus_hlp<X, Y>::type::value; 
    
    int main()
    {
        std::cout << std::boolalpha << detail::has_plus_v<int, std::string> << std::endl;
        auto f = [](auto& a, auto& b) {
            std::cout << std::boolalpha << detail::has_plus_v<decltype(a), decltype(b)> << std::endl;
        };
        std::string str = "HELLO";
        int num = 5;
        f(num, str);
    }
    
    模板
    结构有+hlp{
    模板
    静态std::true_type检查(X&,Y&,decltype(std::declval()+std::declval())={});
    静态标准::错误类型检查(…);
    使用type=decltype(_check(std::declval(),std::declval());
    };
    模板
    constexpr bool has_plus_v=_has_plus_hlp::type::value;
    int main()
    {
    
    std::cout参考您的问题编号

  • 当调用
    \u check
    时,允许对
    X
    进行模板参数推断

  • 类似地,对于
    Y

  • 检查X+Y是否为错误(即X+Y是否存在),并且“={}”是第三个参数的默认参数。因此在调用
    \u check

  • 编辑


    如果没有运算符+,则返回
    true\u type
    \u check
    版本将被删除,只剩下返回
    false\u type
    \u check
    版本,因此
    \u has\u plus\u hlp::type
    将是
    false\u type
    。这是SFINAE的基本机制。

    是否有
    模板De>头,你错过了什么地方?如果我们没有,那么我们需要定义类<代码> x< /code >和 y>代码>“我提供了一个链接到原始代码”如果你问一个关于代码的问题,你应该提供问题中的代码,而不是链接后面的链接。甚至这个站点上的链接。C++模板:完整指南(第二版)是一本关于这些事情的好书。