使用模板确定 std::array 大小的 CRTP
Using template to determine std::array size CRTP
我在基础 class 中有一个 returns std::array 的纯虚函数。我希望此数组的大小取决于派生 class 中的类型。我尝试了以下方法,但由于类型不完整,编译器似乎无法解析模板。
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'
我也尝试过做类似类型特征的事情,但我又得到了不完整的类型,在这种情况下这是有道理的,因为模板专业化需要 class 在它完成专业化之前真正完成。
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
};
};
有没有人知道如何实现这样的目标?如果可能的话,我不想求助于使用宏。我计划拥有许多不同类型的派生 classes,它们都继承基础 class 但 foo 将 return 不同大小的 std::array 取决于枚举(或其他类型) 在他们自己的 class 中定义。此外,我知道我可以使用 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};
};
};
但是,我有另一个模板化的 class,它将派生作为模板参数,它需要有一个相同大小的数组。
template<typename DerivedClass>
struct other
{
std::array<int, DerivedClass::SIZE> array_;
};
在这种情况下,我希望根据实际的 DerivedClass 来确定 array_ 的大小。有没有办法解决 DerviedClass::SIZE 是 5?也许通过模板参数 DerivedClass 访问基础,如 DerivedClass::base::array_type?
为什么不将大小作为 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};
}
};
更新以回答使用 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>();
}
};
在您的 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};
}
};
我在基础 class 中有一个 returns std::array 的纯虚函数。我希望此数组的大小取决于派生 class 中的类型。我尝试了以下方法,但由于类型不完整,编译器似乎无法解析模板。
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'我也尝试过做类似类型特征的事情,但我又得到了不完整的类型,在这种情况下这是有道理的,因为模板专业化需要 class 在它完成专业化之前真正完成。
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
};
};
有没有人知道如何实现这样的目标?如果可能的话,我不想求助于使用宏。我计划拥有许多不同类型的派生 classes,它们都继承基础 class 但 foo 将 return 不同大小的 std::array 取决于枚举(或其他类型) 在他们自己的 class 中定义。此外,我知道我可以使用 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};
};
};
但是,我有另一个模板化的 class,它将派生作为模板参数,它需要有一个相同大小的数组。
template<typename DerivedClass>
struct other
{
std::array<int, DerivedClass::SIZE> array_;
};
在这种情况下,我希望根据实际的 DerivedClass 来确定 array_ 的大小。有没有办法解决 DerviedClass::SIZE 是 5?也许通过模板参数 DerivedClass 访问基础,如 DerivedClass::base::array_type?
为什么不将大小作为 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};
}
};
更新以回答使用 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>();
}
};
在您的 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};
}
};