【发布时间】:2014-06-26 04:37:23
【问题描述】:
如果以下表达式编译,我想得到 std::true_type:
template<typename T>
static constexpr std::true_type check(T*) ??????
std::declval<T>().func_name( std::declval<Args>()... ) // method to check for
和 std::false_type 否则我通常会这样做
template<typename>
static constexpr std::false_type check(...);
我搜索类似 enable_if 的东西,如果表达式编译,它会返回一个常量类型。看起来很简单,但让我头疼:-)
【问题讨论】:
-
decltype(std::declval<T>().func_name( std::declval<Args>()... ), void(), std::true_type{}) -
@Klaus 那些是
operator,不是多个参数。 -
@Klaus
decltype仅计算变量的 DECLared TYPE,或者,如果()中的内容不是变量,则计算为()中的表达式类型。在这里,表达式是something, void(), std:true_type{}。这是由逗号运算符分隔的三个表达式。最后两个是“功能符号中的强制转换”,它们创建临时/值。void()创建void类型的值,std::true_type{}创建std::true_type类型的临时值。逗号运算符计算所有表达式,但仅“返回”最右边的表达式。 -
OK,发现这里只是简单的用来获取最后一个表达式的类型。但是为什么中间有一个 ..., void(), ... 呢?那只是为了好玩吗?很高兴了解这一点:-) 谢谢!
-
这是为了打破可能超载的
operator,。void类型的参数不能重载,因此expr0, void(), expr1始终使用内置逗号运算符。