c++ - 是否可以根据约束 "overload"别名模板?

标签 c++ templates constraints c++-concepts

我们是否可以有一个别名模板,如果约束为 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>;

会好的。

无论哪种情况,都要求 SomeOtherTypeSomeType 都是有效类型(再次假设这些是占位符)。它不会将 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/

相关文章:

c++ - 为什么 std::ios_base::Init 中的 "Init"是大写的?

c++ - #pragma omp parallel 末尾是否存在隐式障碍?

c++ - 推导可变参数模板参数失败?

ios - Superview 不会根据 subview 约束增加高度

c++ - 为所有用户设置注册表值

c++ - 模板回调的包装器?

c++ - 如何将模板参数添加到全局函数?

r - R 中的约束优化

python - 传递给函数的未知类型的约束

c++ - 在 pragma 并行指令中将数组声明为共享变量并稳定代码