Тест, чтобы определить, является ли тип шаблона в C ++ / CLI управляемым или неуправляемым - PullRequest
0 голосов
/ 23 сентября 2019

У меня есть некоторый шаблонный код, скомпилированный с / 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 для управляемых перечислений, что немного странно для меня

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...