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

问题描述 投票:1回答:1

是否有用于测试的通用模板/宏,例如。如果定义了名称,则为ala。 is_transparent的工作方式。

is_transparent使comparator对于is_transparent透明(即可以使用自定义类型进行查找/等)。它只需要定义为任何东西,例如。 std::set

[我希望对某些自定义类型执行类似的操作,但是理想情况下,我会使用using is_transparent = void;中的某些内容(甚至是宏),或者可以使用有关实现的指南。

问题是,如何测试是否基于合格名称定义了(存在?)类型?

c++ template-meta-programming sfinae
1个回答
3
投票

使用检测惯用法:

[#include <iostream> #include <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::is_detected_v<detect_transparent, A> << '\n'; // 0 std::cout << std::is_detected_v<detect_transparent, B> << '\n'; // 1 } 是C ++ 20的功能。

GCC 9.2和Clang 9仍将其视为实验功能。要使其在那些编译器版本上运行,您需要将std::is_detected_v替换为<type_traits>,并将<experimental/type_traits>替换为std::is_detected_v

如果使用较旧的编译器,则可能需要自己实现std::experimental::is_detected_v

is_detected_v
© www.soinside.com 2019 - 2024. All rights reserved.