簡體   English   中英

使用模板確定std :: array的大小CRTP

[英]Using template to determine std::array size CRTP

我有一個純虛函數,它在基類中返回std :: array。 我希望此數組的大小取決於派生類中的類型。 我已經嘗試了以下方法,但是由於類型不完整,似乎編譯器無法解析模板。

template<typename T>
struct base
{
    virtual std::array<int, T::SIZE> foo(void) = 0;
};

struct derived : public base<derived>
{
    enum 
    {
        SIZE = 5
    };
    std::array<int, derived::SIZE> foo(void) 
    {
        return std::array<int, derived::SIZE>{1,2,3,4,5};
    };
};

在'struct base'的實例中:12:25:從此處開始9:38:錯誤:嵌套名稱說明符中使用的不完整類型'derived'

我也嘗試過做類似類型特征的事情,但是我又得到了不完整的類型,在這種情況下,這是有道理的,因為模板專門化需要類在完成專門化之前實際完成。

template<typename T>
struct sizeTrait;

template<typename T>
struct base
{
    virtual std::array<int, sizeTrait<T>::SIZE> foo(void) = 0;
};

struct derived : public base<derived>
{
    std::array<int, sizeTrait<derived>::SIZE> foo(void) 
    {
        return std::array<int, sizeTrait<derived>::SIZE>{1,2,3,4,5};
    };
};

template<>
struct sizeTrait<derived>
{
    enum
    {
        SIZE = 5
    };
};

有誰對實現這樣的目標有任何想法嗎? 如果可能的話,我不想訴諸宏。 我計划有許多不同類型的派生類,這些派生類都繼承基類,但是foo將根據在自己的類中定義的枚舉(或其他某種類型)返回不同大小的std :: array。 另外,我知道我可以使用std :: vector,但是我想使用數組來完成此操作,因為輸出的大小已經確定。

編輯:

建議使用base中的模板參數來確定數組大小。

#include <array>

template<typename T, size_t S>
struct base
{
    using array_type = std::array<int, S>;
    virtual array_type foo() = 0;
};

struct derived : public base<derived, 5>
{
    array_type foo() override
    {
        return array_type {1, 2, 3, 4, 5};
    };
};

但是,我還有另一個模板類,將派生作為模板參數,它需要具有相同大小的數組。

template<typename DerivedClass>
struct other
{
    std::array<int, DerivedClass::SIZE> array_;
};

在這種情況下,我希望根據DerivedClass的實際大小確定array_的大小。 有沒有辦法解決DerviedClass :: SIZE為5? 也許通過像DerivedClass :: base :: array_type這樣的模板參數DerivedClass訪問基?

在您的sizeTrait嘗試中,您只需要將其定義移到derived使用之前即可。 你完成,隨着一個向前聲明derived

template<typename T>
struct sizeTrait;

template<typename T>
struct base
{
    virtual std::array<int, sizeTrait<T>::SIZE> foo(void) = 0;
};

struct derived;

template<>
struct sizeTrait<derived>
{
    enum
    {
        SIZE = 5
    };
};

struct derived : public base<derived>
{
    std::array<int, sizeTrait<derived>::SIZE> foo(void) 
    {
        return std::array<int, sizeTrait<derived>::SIZE>{1,2,3,4,5};
    }
};

為什么不將size作為基礎的模板參數呢?

#include <array>

template<typename T, size_t S>
struct base
{
    using array_type = std::array<int, S>;
    virtual array_type foo() = 0;
};

struct derived : public base<derived, 5>
{
    array_type foo() override
    {
        return array_type {1, 2, 3, 4, 5};
    }
};

更新以回答使用derived從類訪問數組類型(或大小)的問題。 您可以訪問以下類型:

template<class T>
struct another
{
    using array_type = typename T::array_type;

    array_type bar()
    {
        return array_type {1, 2, 3, 4, 5};
    }

    static constexpr size_t size()
    {
        // Returns 5
        return std::tuple_size<array_type>();
    }
};

暫無
暫無

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

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