c语言函数返回两个参数,c – 什么是带有两个参数的decltype?

Edit, in order to avoid confusion: decltype does not accept two arguments. See answers.

以下两个结构可用于在编译期间检查类型T上的成员函数是否存在:

// Non-templated helper struct:

struct _test_has_foo {

template

static auto test(T* p) -> decltype(p->foo(), std::true_type());

template

static auto test(...) -> std::false_type;

};

// Templated actual struct:

template

struct has_foo : decltype(_test_has_foo::test(0))

{};

我认为这个想法是在检查成员函数的存在时使用SFINAE,因此在p-> foo()无效的情况下,只定义了返回std :: false_type的省略号test.否则,第一个方法是为T *定义的,并将返回std :: true_type.实际的“切换”发生在第二个类中,它继承自test返回的类型.与使用is_same和类似的东西的不同方法相比,这看起来更聪明和“轻量级”.

带有两个参数的decltype首先让我感到惊讶,因为我认为它只是获得表达式的类型.当我看到上面的代码时,我认为它类似于“尝试编译表达式并始终返回第二种类型.如果表达式无法编译则失败”(所以隐藏此专业化; SFINAE).

但:

然后我想我可以使用这个方法来编写任何“is valid expression”检查器,只要它依赖于某种类型T.示例:

...

template

static auto test(T* p) -> decltype(bar(*p), std::true_type());

...

这个,我想,当且仅当bar被定义为接受T作为第一个参数(或者如果T是可转换的,等等)时,这将返回std :: true_type,即:如果bar(* p)将编译如果它是在某些上下文中写的,其中p被定义为类型T *.

但是,上面的修改总是评估为std :: false_type.为什么是这样?我不想用一些复杂的不同代码修复它.我只是想知道为什么它不像我预期的那样工作.很明显,带有两个参数的decltype与我想的不同.我找不到任何文件;只用一个表达式解释它到处都是.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值