简要描述;简介:
考虑一个用于保存整数值的基于可变参数模板的类型列表:
template<typename... Ts>
struct list {};
using my_int_list = list<std::integral_constant<0>,
std::integral_constant<1>,
std::integral_constant<2>>;
这可以使用数组初始化器和可变参数包扩展转储到数组中:
template<typename LIST>
struct to_array;
template<typename... Ts>
struct to_array<list<Ts...>>
{
static constexpr unsigned int result[] = { Ts::value... };
};
现在考虑我想对二维数组做同样的事情(换句话说,输入是类型列表的类型列表)。我们可以使用后面的元函数来转储子数组,并使用第二个元函数来转储外部数组:
template<typename LIST>
struct to_2d_array;
template<typename... Ts>
struct to_2d_array<list<Ts...>>
{
using value_type = unsigned int; //To simplify things, suppose we know the type
//of the elements. Also suppose the array is
//squared.
static constexpr value_type result[sizeof...(Ts)][sizeof...(Ts)] = { to_array<Ts>::result... };
};
我的问题(即深入的上下文):
我正在编写编译时 Mandelbrot 分形渲染。渲染工作“正常” 1,并将结果作为 RGB 值的方形 2d 类型列表(相同长度的类型列表的类型列表)返回。需要元函数将to_2d_array
结果转储到数组并在运行时将其写入 PPM 文件。
RGB 值是等效于 的整数包装器的实例std::integral_constant<unsigned int>
,它有一个value
保存该值的成员。
我上面发布的代码正是我在实现中编写的,使用标准类型 ( std::integral_constant
) 而不是我自己的类型。上面的代码在 coliru完美运行,但我的编译器(GCC4.8.1)说:
初始化器需要用一个额外的大括号括起来。
在to_2d_array
. 如果我放了额外的大括号,则赋值编译会失败,并出现“从指针到数组的无效转换”。
我做错了什么?是否有另一个近似值来实现这一目标?
[1] 现在真的不行了,因为这个模板元编程怪物的编译会导致 GCC 内部分段错误:)。但是这个问题与问题无关......