c++ - 使用模板确定 std::array 大小 CRTP

标签 c++ templates 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:错误:嵌套名称说明符中使用的不完整类型“派生”

我也尝试过做类似类型特征的事情,但我再次得到不完整的类型,在这种情况下这是有意义的,因为模板特化需要类在完成特化之前实际完成。

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 但我想使用数组来执行此操作,因为输出的大小已经确定。

编辑:

建议在基数中使用模板参数来确定数组大小。

#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_ 的大小。有没有办法解决 DeviedClass::SIZE 为 5 的问题?也许可以通过模板参数 DerivedClass 访问基类,如 DerivedClass::base::array_type?

最佳答案

在您的 sizeTrait 尝试中,您只需将其定义移至 衍生 中的使用之前即可。您可以通过衍生的前向声明来实现这一点:

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

关于c++ - 使用模板确定 std::array 大小 CRTP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53128661/

相关文章:

c++ - 如何将一系列if/else if/else if/关系链转换成线性循环代码

c++ - 函数的推导

c++ - 以类为参数调用模板类的静态模板方法

c++ - 提高克隆模式的安全性

c++ - 按值删除 map 元素

c++ - QTreeWidgetItem 多选使用键盘

c++ - 使用 C++ 将子类与父类链接的方法

c++ - CRTP 编译,但我不希望它编译。如何?

c++ - 我的 iOS Metal 计算内核是否存在编译器错误,或者我遗漏了什么?

C++ 无法覆盖纯虚函数