У меня есть тип, как это:Условное определение типа псевдоним
template<typename T>
struct wrapper
{
using foo = typename T::foo;
using bar = typename T::bar;
using baz = typename T::baz;
// More of those...
};
Я хотел foo
, bar
, baz
и эквивалентные псевдонимами типа, чтобы определить, если и только если эквивалентный тип в T
существует. Решения с использованием std::conditional
позволяют заменить его чем-то другим, когда он не существует, но я не знаю, как убедиться, что он вообще не существует, если соответствующий тип не существует в типе шаблона. Приведенный выше код вызывает ошибку при создании wrapper<T>
, если T
не определяет один из псевдонимов типа.
Я не могу сделать wrapper
наследовать от T
потому wrapper
не должен делать все, что T
может сделать. Кроме того, использование частичной специализации приведет к некоторому экспоненциальному взрыву и быстро станет недостижимым. Я мог бы сделать foo
, bar
... шаблон псевдонимами типа впрыснуть в std::enable_if
в параметре шаблона по умолчанию, но тогда пользователи должны написать wrapper<T>::foo<>
, wrapper<T>::bar<>
вместо wrapper<T>::foo
, wrapper<T>::bar
и т.д ... и я не хочу этого.
Есть ли простой, но поддерживаемый способ определения такого псевдонима типа, только если соответствующий псевдоним типа существует в T
?
Это решение, которое я имел в виду, и я был готов попробовать его. Это не очень красиво, но еще более удобно, чем другие решения, не подвергая пользователей бесполезным вещам. Спасибо :) – Morwenn
Dang. Я надеялся, что это будет более приятное решение. – Justin