使用C++20概念专门化类模板的成员函数



我想专门化类模板的成员函数,如下所示:

#include <concepts>
template <typename T>
struct S {
void f();
};
template <typename T>
void S<T>::f() {
}
// (0) This is fine.
template <>
void S<int>::f() {
}
// (1) This triggers an error.
template <std::integral T>
void S<T>::f() {
}

专门化(0(是可以的,但专门化f()仅用于int类型。相反,我想专门化它,例如,对于任何积分类型,如(1(所示。使用C++20概念,这可能吗?请注意,std::integral只是一个示例,我的具体案例使用了用户定义的概念。

只需使用尾随的requires子句。编译器将选择最受约束的函数:

#include <concepts>
#include <iostream>
template <typename T>
struct S {
void f();

void f() requires std::integral<T>;
};
template <typename T>
void S<T>::f() {
std::cout << "generaln";
}
template <typename T>
void S<T>::f() requires std::integral<T> {
std::cout << "constrainedn";
};

int main() {
S<int> x;
S<double> y;

x.f(); // prints constrained
y.f(); // prints general
return 0;
}

最新更新