我们是否可以有一个别名模板,如果约束为 false,则该模板指向一个类型;如果该约束为 true,则该模板指向另一个类型?
template < class T >
using MyType = SomeType;
template < class T >
requires SomeConstraint
using MyType = SomeOtherType;
我知道这样做不能编译,但是有解决方法吗?因为我希望在不遵守约束的情况下将类中的某些类型设置为 void ,或者在遵守约束的情况下将其设置为其他类型,而不必使整个类都需要该约束
最佳答案
是的,可以通过将别名移动到类中并部分专门化该类(然后从外部为类中的别名添加别名),或者对于您显示的更简单的情况:
template<typename T>
using MyType = std::conditional_t<requires{ requires SomeConstraint; },
SomeOtherType, SomeType>;
取决于 SomeConstraint
是什么(我假设它是比标识符更复杂的占位符)也可能只是
template<typename T>
using MyType = std::conditional_t<SomeConstraint,
SomeOtherType, SomeType>;
会好的。
无论哪种情况,都要求 SomeOtherType
和 SomeType
都是有效类型(再次假设这些是占位符)。它不会将 SFINAE 应用于它们。如果没有给出,您需要回退到类部分特化方法。
类模板部分特化方法:
template<typename T>
struct MyTypeImpl {
using type = SomeType;
};
template<typename T>
requires SomeConstraint
struct MyTypeImpl<T> {
using type = SomeOtherType;
};
template<typename T>
using MyType = typename MyTypeImpl<T>::type;
关于c++ - 是否可以根据约束 "overload"别名模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74020898/