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

时间:2019-09-22 23:43:22

标签: c++-cli

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

template <typename T> void foo( )
{
}

,我想知道是否有可能检测T是托管类型还是非托管类型。所以像

template <typename T> void foo( )
{
     constexpr bool b = is_managed_type<T>;
}

如果尝试了所有标准库类型特征以及此处https://docs.microsoft.com/en-us/cpp/extensions/compiler-support-for-type-traits-cpp-component-extensions?view=vs-2019中提到的特征,但未找到在所有情况下均有效的任何东西。此问题的一个特殊实例是判断枚举是托管枚举还是非托管枚举。那么有可能实现这样的类型特征吗?

添加了9/23/19 我在is_managed_type特征上确实取得了一些进展。我有以下

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 { };

基本思想是测试是否可以为给定类型调用采用System :: Object ^的函数。注意,我确实尝试过诸如std :: is_base_of和std :: is_convertible之类的事情,但是它们都存在问题。 但是,对于托管枚举来说,这似乎返回false,这对我来说有点奇怪

0 个答案:

没有答案