C++ C++;11种查找类型是否具有成员函数或支持运算符的方法?

C++ C++;11种查找类型是否具有成员函数或支持运算符的方法?,c++,c++11,C++,C++11,有一种(看起来)不错的C++03方法可以确定类型是否具有成员函数或运算符: 没有现代的C++11方法可以做到这一点吗?最好不要包含任何外部代码,只使用标准。不,基本上也是这样。或多或少实现各不相同,但您可以用标准库特性替换该实现内部使用的一些元函数。但是,没有简单的方法可以检测在给定一组参数的情况下,是否可以对某个类型调用函数 这适用于。这适用于GitHub(演示:)中给出的所有测试用例: #包括 模板 结构是\调用\可能的:public std::false \类型{}; 模板 结构是\调用

有一种(看起来)不错的C++03方法可以确定类型是否具有成员函数或运算符:


没有现代的C++11方法可以做到这一点吗?最好不要包含任何外部代码,只使用标准。

不,基本上也是这样。或多或少实现各不相同,但您可以用标准库特性替换该实现内部使用的一些元函数。但是,没有简单的方法可以检测在给定一组参数的情况下,是否可以对某个类型调用函数


这适用于。

这适用于GitHub(演示:)中给出的所有测试用例:

#包括
模板
结构是\调用\可能的:public std::false \类型{};
模板
结构是\调用\可能的::类型
>:public std::true_type{};

C++11增加了一个新技巧,我经常戏称之为“CFINAE”(编译失败不是错误)

它利用了
decltype
操作符和SFINAE的常规属性

考虑以下功能:

template <typename X, typename Y>
static auto check(X& x, Y& y) -> decltype(x >> y);
模板
静态自动检查(X&X,Y&Y)->decltype(X>>Y);
仅当
X
Y
为 定义了移位运算符。为
check
添加一个常规的catch-all重载,您就有了一种机制来测试是否可以编译任意表达式

事实上,这是安德鲁·萨顿(该提案的作者之一)在实验图书馆中提出的原则。事实上,我的例子是直接从实现这个概念

我推荐安德鲁·萨顿(Andrew Sutton)和比亚恩·斯特劳斯特鲁普(Bjarne Stroustrup)在《GoingNative 2012》中的以下演示,其中他们介绍了新的概念和原始库:


基于SFINAE,我使用以下众所周知的方法:

#定义类型(ClassName,Expr)\
模板\
结构类名称\
{                                                            \
私人:\
模板\
静态constexpr标准::假_型试验(…)\
\
模板\
静态decltype((Expr),std::true_type{})测试(int)\
\
公众:\
静态constexpr bool value=decltype(测试(0))::值\
};
宏的主要目的是简化添加类型检查。宏定义了一个结构,允许您对类型
T
执行任意检查

例如,要检查是否可以为类型调用
std::begin()

名称空间详细信息
{
TYPE_支持(SupportsBegin,std::begin(std::declval()))
}
模板
constexpr bool supportsBegin()
{
返回detail::SupportsBegin::value;
}

当然,
detail
名称空间和函数包装器都是语法上的甜点,但是在调用方方面稍微改进了语法。

这个问题是有目的的,还是你只是好奇的非常好和简洁的解释。也许supportsBegin()函数应该并且必须返回一个constexpr bool,以便在类型traits中使用
template <typename X, typename Y>
static auto check(X& x, Y& y) -> decltype(x >> y);