我有一个这样的类型:
template<typename T>
struct wrapper
{
using foo = typename T::foo;
using bar = typename T::bar;
using baz = typename T::baz;
// More of those...
};
如果在模板类型T中等效的类型存在,我希望定义
foo
,bar
,baz
和等效类型别名。使用std::conditional
的解决方案可以在不存在时将其替换为其他内容,但当相应类型在模板类型中不存在时,我不知道如何确保它根本不存在。如果T
没有定义其中一个类型别名,则上面的代码在实例化wrapper<T>
时会导致错误。我不能让
wrapper
继承自T
,因为wrapper
不应该做到T
所能做到的一切。另外,使用部分特化会导致某种指数爆炸并且很快变得不可维护。我可以将foo
,bar
等模板类型别名制成默认模板参数,以注入std::enable_if
,但是用户将不得不编写wrapper<T>::foo<>
,wrapper<T>::bar<>
而不是wrapper<T>::foo
,wrapper<T>::bar
等,我不想要这个结果。是否有一种简单而易于维护的方法只在
T
中存在相应类型别名时定义这样的类型别名?