当前位置: 首页 > 知识库问答 >
问题:

在编译时获取“std::initializer\u list”的大小

唐烨煜
2023-03-14

我试图用C(11/14)实现fortran的重塑功能,并设计了一个函数。此函数接受两个std::initializer\u列表。第一个initializer\u列表给出了我用来初始化多维数组的初始值。第二个initializer\u列表给出了数组每个维度的大小。我写了一份这样的草稿

template<int D, typename T>
auto forreshape(const std::initializer_list<T> & values, const std::initializer_list<int> & shape)
{
    // some irrelevant codes to calculate lbound
    return for1array_gen<T, D>(lbound, shape, values); // returns D dimension array fornarray<T, D>
}
int main(){
    auto reshaped_array = forreshape<2>({1, 2, 3, 4, 5, 6}, {2, 3});
}

这个实现需要给定的非类型模板参数int D,但我想要不带D的东西,比如重塑({1,2,3,4,5,6},{2,3}) 。首先,我想使用std::initializer\u list

共有1个答案

陈嘉荣
2023-03-14

也许使用std::initializer_list是个坏主意?

我想是的考虑一下

std::initializer_list<int> t;
std::initializer_list<int> a = {1,2,3};
std::initializer_list<int> b = {2,3};
if (rand() > 42)
    t = a;
else
    t = b;
auto reshaped_array = forreshape({1,2,3,4,5,6}, t);

在上面的例子中,在编译时不可能知道t.size()

但由于CWG 1591,您可以要求编译器通过引用C样式数组来推断初始值设定项列表的长度。

重塑的定义如下:

template<int D, typename T>
auto forreshape(const std::initializer_list<T> & values, const int (&shape)[D])
{
    // use D...
}
 类似资料:
  • 我很想知道为什么下面代码中的第二个不起作用。似乎即使数组是对的引用,数组的大小也嵌入在类型中,因此它应该在编译时可用。

  • 如果我有一个简单的结构 那我就可以了 现在,我希望在初始化点时有相同的行为,点成为类,但x和y变为私有并使用访问器等。 我的第一次尝试是 哪种工作但将编译时错误更改为运行时错误。现在的问题是:我如何使此类的行为与简单结构相同,即当初始化列表太大时导致编译时错误? 环顾四周,我发现 static_assertinitializer_list::size() 为什么size不是std::initial

  • 问题内容: 是否有可能为本地运行的Java应用程序和作为applet和/或JNLP Webapps可靠地确定给定类的编译时间戳? 问题答案: 根据Java虚拟机规范,类文件格式不需要任何类型的时间戳,因此,您最好的办法是检查包含该类的类或Jar文件的修改时间。不幸的是,文件系统操作(尤其是在各种主机之间)可能无法保留此类时间戳。 我会说默认情况下没有可靠的方法。但是,您可以在构建过程中轻松地将这样

  • 问题内容: 考虑下面的Java 方法测试。请注意,我从这个有用的答案中借用了代码。 但是,请注意,会有一个试图把一个时进入。 输出: 可以通过Java泛型在编译时防止此错误吗? 问题答案: 之所以存在,恰恰是因为Java的类型系统无法正确处理这种情况(IIRC,在泛型出现之前,以与集合框架相同的方式改造数组为时已晚)。 因此,通常无法在编译时防止此问题。 当然,您可以创建内部API来包装此类操作,

  • 刚接触C语言的我,正试图了解initializer\u list。 我正在制作一个Matrix类,它有效地存储了一个双值的二维数组。我没有在结构层面上得到这个项目。就像好吧,我们制作了一个Matrix类,它本质上存储了一个2D数据数组。但是它需要能够存储任何大小的数组,所以它必须使用动态分配的数组。但是std::array是不允许的。 我不知道如何访问i_list中的项目。如果它们像 然后根据我看

  • 在这个论坛线程之后,我怀疑这可能是由于缺少到openssl库文件的链接(在针对不同环境进行编译时,项目指向不同的lib文件夹)。因此,我在编译器中搜索了ARM(arm-arago-linux-gnueabi)中所有与“OpenSSL”相关的文件,这些文件包含在。So所在的同一个文件夹中;同样的错误。然后我怀疑lib本身有其他依赖项,而这些依赖项不在path_to_libs中,所以我执行了,然后在,