C++ 在编译时创建N个对象的最佳方法

C++ 在编译时创建N个对象的最佳方法,c++,arrays,templates,object,C++,Arrays,Templates,Object,我想知道如何在编译时使用模板创建N个对象。或者这确实是一种很好的做法 我有一个包含一些常量的头文件: constexpr size_t N_TIMES = 3; constexpr uint32_t MIN[N_TIMES] = {0,1,2}; constexpr uint32_t MAX[N_TIMES] = {1,2,3}; 然后是包含模板的头文件,该模板将生成“N”次: 但是因为它在构造函数中,所以编译之后它会生成它。所以我真的想知道我应该怎么做。如果有某种聪明的递归技巧,我可以在编译

我想知道如何在编译时使用模板创建N个对象。或者这确实是一种很好的做法

我有一个包含一些常量的头文件:

constexpr size_t N_TIMES = 3;
constexpr uint32_t MIN[N_TIMES] = {0,1,2};
constexpr uint32_t MAX[N_TIMES] = {1,2,3};
然后是包含模板的头文件,该模板将生成“N”次:


但是因为它在构造函数中,所以编译之后它会生成它。所以我真的想知道我应该怎么做。如果有某种聪明的递归技巧,我可以在编译时为自己创建这些对象

您可以使用
std::index\u序列

namespace detail
{

    template <typename T, std::size_t N, std::size_t...Is>
    std::array<Foo<T>, N> make_foo_array(std::index_sequence<Is...>)
    {
        return {{Foo<T>(MIN[Is], MAX[Is])...}};    
    }

}

template <typename T, std::size_t N>
std::array<Foo<T>, N> make_foo_array()
{
    return detail::make_foo_array<T, N>(std::make_index_sequence<N>{});
}
名称空间详细信息
{
模板
std::数组make\u foo\u数组(std::index\u序列)
{
返回{Foo(MIN[Is],MAX[Is])…};
}
}
模板
std::数组make_foo_数组()
{
返回细节::make_foo_数组(std::make_index_序列{});
}
然后

template <typename T>
class bar 
{
public:
    bar() : foo_(make_foo_array<T, N_TIMES>()) {}
private:
    std::array<foo<T>, N_TIMES> foo_;
};
模板
分类栏
{
公众:
bar():foo(make_foo_数组()){}
私人:
std::数组foo_;
};

听起来像是XY问题。你到底想做什么?你可以使用索引技巧和转发CTOR:让你直接构造thr foo数组,没有循环或赋值。@fiz:
index\u序列
make\u index\u序列
可以在c++11中生成(但实际上是在c++14中引入的)。这里的解决方案
cannot be assigned because its copy assignment operator is implicitly deleted
namespace detail
{

    template <typename T, std::size_t N, std::size_t...Is>
    std::array<Foo<T>, N> make_foo_array(std::index_sequence<Is...>)
    {
        return {{Foo<T>(MIN[Is], MAX[Is])...}};    
    }

}

template <typename T, std::size_t N>
std::array<Foo<T>, N> make_foo_array()
{
    return detail::make_foo_array<T, N>(std::make_index_sequence<N>{});
}
template <typename T>
class bar 
{
public:
    bar() : foo_(make_foo_array<T, N_TIMES>()) {}
private:
    std::array<foo<T>, N_TIMES> foo_;
};