能否在字面量类型类内定义可用于模板参数的静态常量?
问题描述
给定如下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
相关产品推荐
相关产品推荐

