首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何检测是否。定义了T::is_transparent?

如何检测是否。定义了T::is_transparent?
EN

Stack Overflow用户
提问于 2019-12-19 14:27:48
回答 1查看 153关注 0票数 1

是否有通用模板/宏用于测试例如。如果名字被定义了,那就是ala。is_transparent是如何工作的。

is_transparent使比较器对std::set透明(即。可以使用自定义类型查找/等)。它只需要被定义成任何东西,例如。using is_transparent = void;

Im希望对某些自定义类型执行类似的操作,但理想情况下,我应该使用来自标准助推的一些东西(甚至是宏),或者我可以使用有关实现的指导。

问题是,如何测试类型是否已定义(是否存在?)基于限定名?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-19 14:37:59

使用检测成语:

代码语言:javascript
复制
#include <iostream>
#include <experimental/type_traits>

struct A {};

struct B
{
    using is_transparent = void; // Any other type works too.
};

template <typename T> using detect_transparent = typename T::is_transparent;

int main()
{
    std::cout << std::experimental::is_detected_v<detect_transparent, A> << '\n'; // 0
    std::cout << std::experimental::is_detected_v<detect_transparent, B> << '\n'; // 1
}

is_detected_v库基础TS v2的一个实验特性.

如果您的编译器不支持它,或者您不喜欢在代码中看到单词experimental,您可以自己实现它:

代码语言:javascript
复制
namespace impl
{
    template <typename T, typename ...P>
    struct dependent_type {using type = T;};

    // `std::void_t` used to be broken in Clang (probably it no longer is),
    // so I use a custom safe replacement instead.
    template <typename A, typename ...B>
    using void_type = typename dependent_type<void, A, B...>::type;

    template <typename DummyVoid, template <typename...> typename A, typename ...B>
    struct is_detected : std::false_type {};

    template <template <typename...> typename A, typename ...B>
    struct is_detected<void_type<A<B...>>, A, B...> : std::true_type {};
}

template <template <typename...> typename A, typename ...B>
inline constexpr bool is_detected_v = impl::is_detected<void, A, B...>::value;
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59411729

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档