是否有用于测试的通用模板/宏,例如。如果定义了名称,则为ala。 is_transparent
的工作方式。
is_transparent
使comparator对于is_transparent
透明(即可以使用自定义类型进行查找/等)。它只需要定义为任何东西,例如。 std::set
[我希望对某些自定义类型执行类似的操作,但是理想情况下,我会使用using is_transparent = void;
或std中的某些内容(甚至是宏),或者可以使用有关实现的指南。
问题是,如何测试是否基于合格名称定义了(存在?)类型?
使用检测惯用法:
boost
[#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