c++ - 使用模板在编译时初始化数组指针的 const vector

标签 c++ c++11 templates vector metaprogramming

下面的类不能在 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/

相关文章:

c++ - 是否建议使用 extern 来避免 header 依赖?

C++11 无法移动内部有 unordered_map 的类

c++ - C++中无向图中的连接组件

c++ - 全局范围内的智能指针

c++ - 方法访问控制和POD

django - 为什么 Django 不会自动转义我的 &lt;script&gt; 标签?

c++ - 如何在现代 C++ 中实现没有宏的系统特定函数

c++ - 获取重载函数模板的地址是可能的,有时

c++ - 谐波级数和 c++ MPI

ubuntu - stream_descriptor 的 boost::asio::async_read() 现在返回 EOF