簡體   English   中英

CRTP:使用來自派生的 class 的 static constexpr

[英]CRTP: use static constexpr from derived class

我的 CRTP 派生的 class 具有一些我使用static constexpr定義的編譯時固定維度。 現在我想將它用作基礎 class 中的 static 變量。 我該怎么做呢?

例子:

#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;
}

這失敗了:

error: non-type template argument is not a constant expression
        std::array<size_t, n> a;
                           ^

我也想過使用

std::array<size_t, derived_cast().n> a;

但這失敗了:

error: non-type template argument is not a constant expression
        std::array<size_t, derived_cast().n> a;
                           ^~~~~~~~~~~~~~~~

那我應該放什么?

auto n = derived_cast().n; 應該:

constexpr auto n = D::n;

演示

std::array<size_t, D::n>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM