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

能否在字面量类型类内定义可用于模板参数的静态常量?

问题描述

给定如下C++类:

class LiteralType {
  public:
    constexpr LiteralType(size_t v): v_(v) {}

    std::string tag() const {
      std::ostringstream os;
      os << v_;
      return os.str();
    }

    constexpr size_t doubled() const {
      return v_ * 2;
    }

  private:
    size_t v_;
};

需要在类内部定义一个静态成员常量(如LiteralType::kFive),使其能够用于std::array<size_t, LiteralType::kFive.doubled()>这类模板参数场景(即编译期可用)。实际使用的是模板类,因此更希望将该常量定义在类内部。目前已实现静态函数方案:

static constexpr LiteralType five() {
    return {5};
}

但更倾向于使用常量形式。

解决方案

在C++17及更高版本中,可以直接在类内定义内联的constexpr静态成员常量,完全满足编译期模板参数的使用要求,代码修改如下:

class LiteralType {
  public:
    constexpr LiteralType(size_t v): v_(v) {}

    std::string tag() const {
      std::ostringstream os;
      os << v_;
      return os.str();
    }

    constexpr size_t doubled() const {
      return v_ * 2;
    }

    // 类内直接定义并初始化constexpr静态成员
    static constexpr LiteralType kFive{5};

  private:
    size_t v_;
};

关键说明

  • constexpr修饰的静态成员本身就是编译期常量,内联初始化(C++17特性)后无需在类外单独定义,直接可在类外部访问
  • kFive.doubled()调用的是constexpr成员函数,返回值也是编译期常量,完全符合std::array模板参数必须是编译期值的要求
  • 如果是模板类,该写法同样适用,只需将class替换为template <typename T> class,静态成员的定义方式保持不变

验证使用示例

#include <array>

int main() {
    // 完全合法,编译期即可确定数组大小
    std::array<size_t, LiteralType::kFive.doubled()> arr;
    static_assert(arr.size() == 10); // 编译期断言验证
    return 0;
}

内容的提问来源于stack exchange,提问作者Eugene

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 02:04:54