C++ cli 测试以检测C+中是否存在模板类型+/CLI是托管的还是非托管的

C++ cli 测试以检测C+中是否存在模板类型+/CLI是托管的还是非托管的,c++-cli,C++ Cli,我有一些使用/clr编译的模板代码,如下所示 template <typename T> void foo( ) { } int check( System::Object^ ); template <typename T, typename U = void> using converts_to_system_object_t = decltype(check(std::declval<T>())); template<typename T,

我有一些使用/clr编译的模板代码,如下所示

template <typename T> void foo( )
{
}
int check( System::Object^ );

template <typename T, typename U = void> using converts_to_system_object_t = decltype(check(std::declval<T>()));


template<typename T, typename = void> struct is_managed_type: std::false_type {};

template<typename T> struct is_managed_type<T, converts_to_system_object_t<T>> : std::true_type { };
模板void foo()
{
}
我想知道是否有可能检测到T是托管类型还是非托管类型。大概是

template <typename T> void foo( )
{
     constexpr bool b = is_managed_type<T>;
}
模板void foo()
{
constexpr bool b=为托管类型;
}
If已经尝试了所有std库类型特征和这里提到的那些,但没有发现任何在所有情况下都有效的特征。此问题的一个特定实例是判断枚举是托管枚举还是非托管枚举。那么有可能实现这样的类型特征吗

19年9月23日增补 我确实在is_管理型特质方面取得了一些进展。我有以下几点

template <typename T> void foo( )
{
}
int check( System::Object^ );

template <typename T, typename U = void> using converts_to_system_object_t = decltype(check(std::declval<T>()));


template<typename T, typename = void> struct is_managed_type: std::false_type {};

template<typename T> struct is_managed_type<T, converts_to_system_object_t<T>> : std::true_type { };
int检查(系统::对象^);
使用的模板将_转换为_系统_对象_t=decltype(检查(std::declval());
模板结构是\u管理的\u类型:std::false\u类型{};
模板结构是\u管理的\u类型:std::true\u类型{};
基本思想是测试对于给定类型,是否可以调用接受os System::Object^的函数。注意,我确实尝试过像std::is_base_of和std::is_convertible这样的方法,但它们都有问题。
然而,对于托管枚举,这似乎返回false,这对我来说有点奇怪

该页面上的
\uuu is\uu enum
描述是“如果类型是本机枚举,则返回true”。您看到了不同的情况吗?我确实尝试了uu is_enum,对于托管枚举和非托管枚举,它返回true,这里的非托管枚举指的是“枚举类”。我必须承认,我不确定旧的C++语言枚举是怎样工作的,因为它们使用关键字“EnUM”。所以“如果定义了标准C++ +枚举(没有类或结构),则用/CLR编译将导致枚举被编译为托管枚举。枚举仍然具有非托管枚举的语义。注意,编译器注入一个属性,
Microsoft::VisualC::NativeEnumAttribute
,以确定程序员希望枚举成为本机枚举的意图。其他编译器只会将标准枚举视为托管枚举。“您可以使用
\uuucplusplus\ucli
检测
/clr