C++ 11 std相当于Boost has_dereference

and*_*ley 3 c++ boost sfinae type-traits c++11

很多Boost的SFINAE助手都出现在带有C++ 11的std库中,但has_dereference似乎没有.除了这个功能,我已经设法从我的包中消除了Boost依赖,我想完全摆脱它,那么如何使用C++ 11 std功能获得相同的效果呢?

Nir*_*man 6

检查类是否具有某些没有外部依赖关系的函数的最简单方法通常是void_t成语.

// Define this once in your project somewhere accessible
template <class ... T>
using void_t = void;
Run Code Online (Sandbox Code Playgroud)

那么诀窍总是一样的; 您定义了一个继承自std::false_type以下的类模板:

template <class T, class = void>
struct has_dereference : std::false_type {};
Run Code Online (Sandbox Code Playgroud)

这是"后备"类模板.现在我们将定义一个仅在类型具有我们想要的属性时才有效的特化:

template <class T>
struct has_dereference<T, void_t<decltype(*std::declval<T>())>> : std::true_type {};
Run Code Online (Sandbox Code Playgroud)

要使用,只需:

bool x = has_dereference<int*>::value;
bool y = has_dereference<int>::value;
Run Code Online (Sandbox Code Playgroud)

等等

我会在技术上补充说,operator*实际上是一系列功能; 运营商既可以是CV资格,也可以是价值类别.无论何时对类型执行检测,您实际上都在此系列中进行检测.我不会详细介绍细节,因为它在实践中很少遇到(operator*很少有值类别限定,并且操作符几乎总是有一个const版本,并且很少出现volatile)但是如果你看到一些令人惊讶的东西,它值得注意.

这项技术值得了解,特别是如果您正在进行没有依赖性的元编程,如Boost或Hana.你可以在这里阅读更多关于void_t的信息:`void_t`是如何工作的.