You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 14:24:01