首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CRTP:使用派生类中的静态常量表达式

CRTP:使用派生类中的静态常量表达式
EN

Stack Overflow用户
提问于 2021-05-31 02:50:26
回答 2查看 46关注 0票数 0

我的CRTP派生类有一些我使用static constexpr定义的编译时固定维度。现在,我想将它用作基类中的静态变量。我该怎么做呢?

示例:

代码语言:javascript
复制
#include <array>

template <class D>
class Base
{
public:
    void myfunc()
    {
        auto n = derived_cast().n;
        std::array<size_t, n> a;
    }

private:
    auto derived_cast() -> D&
    {
        return *static_cast<D*>(this);
    }

    auto derived_cast() const -> const D&
    {
        return *static_cast<const D*>(this);
    }
};

class A : public Base<A>
{
public:
    A() = default;

private:
    friend class Base<A>;
    static constexpr size_t n = 2;
};


int main()
{
    A a;
    a.myfunc();

    return 0;
}

此操作失败,出现以下错误:

代码语言:javascript
复制
error: non-type template argument is not a constant expression
        std::array<size_t, n> a;
                           ^

我也考虑过使用

代码语言:javascript
复制
std::array<size_t, derived_cast().n> a;

但失败的原因是:

代码语言:javascript
复制
error: non-type template argument is not a constant expression
        std::array<size_t, derived_cast().n> a;
                           ^~~~~~~~~~~~~~~~

那么我应该放什么呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-05-31 02:54:22

auto n = derived_cast().n;应为:

代码语言:javascript
复制
constexpr auto n = D::n;

Demo

票数 2
EN

Stack Overflow用户

发布于 2021-05-31 03:02:53

代码语言:javascript
复制
std::array<size_t, D::n> 
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67764720

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档