У меня есть некоторый шаблонный код, скомпилированный с / clr, что-то вроде следующего
template <typename T> void foo( )
{
}
, и мне интересно, можно ли определить, является ли тип T управляемым или неуправляемым.Так что-то вроде
template <typename T> void foo( )
{
constexpr bool b = is_managed_type<T>;
}
Если вы перепробовали все признаки типа библиотеки std и упомянутые здесь https://docs.microsoft.com/en-us/cpp/extensions/compiler-support-for-type-traits-cpp-component-extensions?view=vs-2019, но не нашли ничего, что работает во всех случаях.Конкретным примером этой проблемы является определение того, является ли перечисление управляемым или неуправляемым.Так возможно ли реализовать черту типа, подобную этой?
Добавлено 23.09.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 { };
Основная идея состоит в том, чтобы проверить, если для данного типа вы можете вызвать функцию, которая принимает OS System :: Object ^.Обратите внимание, что я пробовал такие вещи, как std :: is_base_of и std :: is_convertible, но у них всех были проблемы.Однако, это, кажется, возвращает false для управляемых перечислений, что немного странно для меня