c++ - 是否有必须使用 `is_detected_v` 的典型用例?

标签 c++ standards language-design c++17 typetraits

以下摘自cppref :

#include <experimental/type_traits>

template<class T>
using copy_assign_t = decltype(std::declval<T&>() = std::declval<const T&>());

struct Meow { };

using namespace std::experimental;

int main()
{
    static_assert(is_detected_v<copy_assign_t, Meow>,
        "Meow should be copy assignable!"); // version 1

    static_assert(is_copy_assignable_v<Meow>,
        "Meow should be copy assignable!"); // version 2
}

版本 1版本 2 之间有什么区别吗?

是否有必须使用is_detected_v的典型用例?

最佳答案

std::is_detected 可用作 std::is_copy_assignable 的构建 block 。如果你想检查复制可分配性,你应该使用 std::is_copy_assignable。如果您需要检查自定义操作/成员函数是否存在,std::is_detected 为您提供了一种简单的方法。

template<class T>
using foo_detector = decltype(std::declval<T&>().foo());

static_assert(!is_detected_v<foo_detector, Meow>, "Meow shouldn't have `.foo()`!");

一个现实的示例用例是不同 API 的统一:

template<class T>
using clean_detector = decltype(std::declval<T&>().clean());

template<class T>
using clear_detector = decltype(std::declval<T&>().clear());

template <typename T>
auto clear(const T& x) -> std::enable_if_t<is_detected_v<has_clean, T>>
{
    x.clean();
}

template <typename T>
auto clear(const T& x) -> std::enable_if_t<is_detected_v<has_clear, T>>
{
    x.clear();
}

使用示例:

struct Foo { void clean(); };
struct Bar { void clear(); };

int main()
{
    Foo f; Bar b;
    clear(f);
    clear(b);
}

关于c++ - 是否有必须使用 `is_detected_v` 的典型用例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43065119/

相关文章:

c++ - 用于在 C++ 中存储 double 的可移植二进制文件

c++ - Qt 未定义对 `pugi::xml_document::xml_document()` 的引用

c - 无符号整数减法是否定义了行为?

c# - 为什么不支持 C# 静态类扩展方法?

c# - 为什么访问静态成员 "through"继承类型有用?

python - 我可以使用 pybind11 将 numpy 数组传递给接受 Eigen::Tensor 的函数吗?

c++ - 从 C 程序调用 C++ 函数

c++ - 是否在前向声明的类型未定义行为上使用 typeid?

c++ - 为什么我无法阻止不受欢迎的 C 风格强制转换进行编译?

c# - c# 是否有任何语句不遵循从左到右的评估顺序?