Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::数组<;T、 N>;复杂类型,N=256/大_C++_Arrays_C++14_Constexpr - Fatal编程技术网

C++ std::数组<;T、 N>;复杂类型,N=256/大

C++ std::数组<;T、 N>;复杂类型,N=256/大,c++,arrays,c++14,constexpr,C++,Arrays,C++14,Constexpr,我正在寻找一种方法来填充std::array,其中T是一个非默认的可构造结构/类,N在编译时确实是已知的,但它太大了,以至于您不想对它们全部进行硬编码,例如N=256。构造函数(在我的例子中)接受一个参数,基本上等于N,我想知道是否有一种方法可以获得constepr std::array values,而不必进入复制“N”粘贴地狱 在使用unique_ptr并在动态构建数组时创建所有元素时,会有一个变通方法。但这意味着我不能使用constexpr,也感觉不到它是最好的解决方案 我为我的问题提供了

我正在寻找一种方法来填充
std::array
,其中T是一个非默认的可构造结构/类,N在编译时确实是已知的,但它太大了,以至于您不想对它们全部进行硬编码,例如
N=256
。构造函数(在我的例子中)接受一个参数,基本上等于
N
,我想知道是否有一种方法可以获得
constepr std::array values
,而不必进入复制“N”粘贴地狱

在使用
unique_ptr
并在动态构建
数组时创建所有元素时,会有一个变通方法。但这意味着我不能使用
constexpr
,也感觉不到它是最好的解决方案

我为我的问题提供了一个通用的(!)示例,我希望能以这种方式工作

#包括
#包括
使用名称空间std;
结构T{int value;};//某些具有非默认构造函数的结构/类
//变通的尝试
模板结构TT:public T{constexpr TT():T{N}{};
模板
constexpr数组makeArray(){
返回{
TT{},
TT{},
TT{},
TT{},
TT{},
//太糟糕了,我不能把它概括起来
};
}

ostream&operator似乎适用于
std::make_index_sequence
/
std::index_sequence

template <std::size_t N, std::size_t ... Is>
constexpr array<T, N> makeArray (std::index_sequence<Is...>)
 { return { { TT<Is+1>{} ... } }; }

template <std::size_t N>
constexpr array<T, N> makeArray ()
 { return makeArray<N>(std::make_index_sequence<N>{}); }
模板
constexpr数组makeArray(std::index_序列)
{return{{TT{}…}};}
模板
constexpr数组makeArray()
{返回makeArray(std::make_index_sequence{});}

非常确定
常量的索引序列比值的索引序列更重。索引序列是空类型。@GuillaumeRacicot-真的吗?通过引用传递空结构太重了?嗯,是和否。在优化版本号中。但它限制了将参数用作其他常量表达式的参数:@GuillaumeRacicot-well。。。对如果有一个像样的优化器,并且该参数未被使用,那么我认为没有什么真正的区别;但您是否认为(使用过的)参数(空类型)作为引用而不是副本传递更重?无论如何:好的一点第二点:在这种特殊情况下不是问题,但在更复杂的情况下可能会破坏常量表达式。我会尽力记住的。