C++20带require约束的模板类构造函数前向声明实现方法
带requires约束的构造函数前向声明写法
你只需要把requires子句作为函数签名的一部分,紧跟在函数声明之后即可,如果要将构造函数的声明和实现分离,写法如下:
类内声明代码
#include <type_traits> class CChMyBaseClass { }; template <typename ChClass, typename ChFunction> class CChMyClass : public CChMyBaseClass { private: ChFunction m_ChFunction; public: // 带约束的默认构造函数声明 CChMyClass() requires (std::is_member_function_pointer<ChFunction>::value); // 另一个互斥约束的默认构造函数声明 CChMyClass() requires (!std::is_member_function_pointer<ChFunction>::value); };
类外实现代码
// 实现成员函数指针场景的构造函数 template <typename ChClass, typename ChFunction> CChMyClass<ChClass, ChFunction>::CChMyClass() requires (std::is_member_function_pointer<ChFunction>::value) : CChMyBaseClass() { } // 实现普通函数指针场景的构造函数 template <typename ChClass, typename ChFunction> CChMyClass<ChClass, ChFunction>::CChMyClass() requires (!std::is_member_function_pointer<ChFunction>::value) : CChMyBaseClass() , m_ChFunction(nullptr) { }
注意事项
- requires子句是函数签名的必要组成部分,声明和实现的约束条件必须完全一致,否则编译会报错
- 你示例中main函数的写法属于函数声明,不是类对象实例化,要避免最令人头疼的解析问题,建议改用大括号初始化:
class CChTestClass { public: void ChTest() { } }; void ChTest() { } int main() { CChMyClass<CChTestClass, decltype(&CChTestClass::ChTest)> CChMyClass1{}; CChMyClass<CChTestClass, decltype(&ChTest)> CChMyClass2{}; return 0; } - 按照C++标准规范,下划线开头紧跟大写字母的标识符属于标准库保留标识符,不建议在业务代码中使用,所以示例中把
_ChClass、_ChFunction的前置下划线去掉了。
内容的提问来源于stack exchange,提问作者VeNToR
相关产品推荐
相关产品推荐

