C++20能否通过concepts特性实现模板类的重载?
问题排查与解答
错误原因
你当前的写法违反了C模板定义规则:你定义了两个同名的主类模板S,C不允许重复定义同一个主模板,即便二者的模板约束不同也不支持该写法。
C++20的concept确实支持基于约束的类模板重载,不过要通过类模板偏特化的方式实现,而不是重复定义主模板。
正确实现示例
首先定义无约束的主模板,再针对不同的约束编写偏特化版本即可:
#include <string> #include <concepts> using namespace std; // 定义无约束的主模板 template<typename StringT> struct S {}; // std::string对应的偏特化版本 template<typename StringT> requires same_as<StringT, string> struct S<StringT> {}; // std::wstring对应的偏特化版本 template<typename StringT> requires same_as<StringT, wstring> struct S<StringT> {};
你原代码中嵌套的requires表达式可以直接简化为使用same_as概念,不需要额外多写一层requires表达式包裹。
验证代码
可以用以下代码验证特化逻辑是否正常生效:
int main() { S<string> s1; // 匹配string的偏特化版本 S<wstring> s2; // 匹配wstring的偏特化版本 S<int> s3; // 匹配无约束的主模板 return 0; }
如果不需要无约束的默认版本,也可以只声明主模板不提供定义,仅保留符合约束的偏特化版本即可。
内容的提问来源于stack exchange,提问作者Bonita Montero
相关产品推荐
相关产品推荐

