class 具有约束/概念的模板专业化

class template specialization with constraint / concept

我尝试对 class 专业化使用约束:

struct A {};
struct B {};
struct C {};

template<typename T>
concept bool AorB() {
    return std::is_same<T, A>::value || std::is_same<T, B>::value;
}

template<typename T>
class X {};

template<AorB T>
class X {};

int main() {
    X<A> x1; // error: redeclaration 'template<class T> class X' with different constraints class X {};
    X<B> x2;
    X<C> x3;
}

我不知道我是否在这里犯了错误,或者这通常是不可能的?

有什么方法可以替代这种方法?我可以使用 CRTP 对通用基本模板进行专业化,但这对我来说很难看。

这不是专业化,您实际上重新声明了主模板,这确实是一个错误。
专业化看起来像这样:

template<typename T>
class X { };

template<AorB T>
class X<T> { };
//     ^^^