以下摘自 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
}

version 1version 2 之间有什么区别吗?

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

最佳答案

std::is_detected 可以用作 std::is_copy_assignable 的构建块。如果要检查复制可分配性,则应使用 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/

10-12 20:36