【发布时间】:2018-04-07 19:24:03
【问题描述】:
以下类在 C++11 下无法编译;循环只能在运行时执行,因此循环内的模板类静态函数调用会出现“char(*)[i] 是可变修改类型”错误:
#include <cstddef>
#include <vector>
template <std::size_t N>
class Foo
{
private:
const std::vector<char(*)[]> bar = bar_init();
static std::vector<char(*)[]> bar_init()
{
std::vector<char(*)[]> init;
for (size_t i = N; i > 0; i >>= 1)
{
auto ptr_to_array = MyClass<char(*)[i]>::static_return_ptr_to_array();
init.emplace_back(reinterpret_cast<char(*)[]>(ptr_to_array));
}
return init;
}
};
有没有一种方法可以在初始化函数中使用模板来实现相同的效果?也就是说,在“Foo”类实例化时将大小为 log2(N) 的“bar”初始化为指向 char 数组的指针的 const 向量,每个向量元素包含例如对于 N=32,输出:
MyClass<char(*)[32]>::static_return_ptr_to_array();
MyClass<char(*)[16]>::static_return_ptr_to_array();
MyClass<char(*)[8]>::static_return_ptr_to_array();
//etc...
【问题讨论】:
-
index_sequence可能会有所帮助。 -
你能告诉我们你的
MyClass吗?还是它的简化(但可编译)版本? -
@underscore_d 那里的问题似乎部分适用,但在我的情况下,我的向量只是 const,而不是 const static,“Foo”的每个实例化都可以使用不同的 N 值进行模板化,因此初始化过程bar 似乎需要模板专业化和运行时调用的混合。
-
@max66 我更改了我为示例发布的代码,以便更容易理解我遇到的问题。在实际代码中,模板化的静态方法调用返回一个分配器,该分配器必须在特定类型上进行模板化,在这种情况下,是某个大小的 char 数组。然后调用分配器的 allocate 方法并放弃指向 char 数组的指针,该输出就是我想放入向量中的内容。
标签: c++ c++11 templates vector metaprogramming