下面的类不能在 C++11 下编译;目前的循环只能在运行时执行,因此从循环内的模板类静态函数调用中得到“char(*)[i] is a variably-modified type”错误:
#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 数组的指针的常量 vector ,每个 vector 元素包含例如对于 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...
最佳答案
类似于(在 c++11 中)
template<int I>
struct tag{};
void init( std::vector<char(*)[]>& result, tag<0> ){}
template<int I>
void init( std::vector<char(*)[]>& result, tag<I> )
{
auto ptr_to_array = MyClass<char(*)[I]>::static_return_ptr_to_array;
result.emplace_back(reinterpret_cast<char(*)[]>(ptr_to_array));
init(result,tag<(I>>1)>{});
}
template <std::size_t N>
class Foo
{
private:
const std::vector<char(*)[]> bar = bar_init();
static std::vector<char(*)[]> bar_init()
{
std::vector<char(*)[]> result;
init( result, tag<N>{} );
return result;
}
};
在 c++17 中,这可以通过 if constexpr 和无标签<> 进一步简化。此外,请注意 std::vector<char(*)[]>
不可移植,因为 vector 需要一个完整的类型。
关于c++ - 使用模板在编译时初始化数组指针的 const vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46953850/