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

推断d::a大小?

有骏奇
2023-03-14

在以下代码中:

template<size_t N>
int b(int q, const std::array<int, N>& types)
{
    int r = q;
    for (int t : types)
    {
        r = r + t;
    }
    return r;
}

int main()
{
    b<2>(9, { 2,3 });
}

如何避免在对b的调用中为N指定2?为什么不能自动推断出这种类型?没有它,我得到了错误:

'b':找不到匹配的重载函数'int b(int, constd::array

共有3个答案

汲雅珺
2023-03-14

要推导std::数组大小,可以使用通用lambda(C 14):

auto b = [](int q, const auto& types) {
  int r = q;
  for (int t : types)
  {
      r = r + t;
  }
  return r;
};

int main() {
    std::array<int, 2> arr = {{2,3}};
    b(9, arr);
}

当编译器将实现(或者您将使用它的一些自己的实现)std::make\u array时,在构造时也不需要传递数组大小,只需使用

b(9, std::make_array(2,3));
翟奕
2023-03-14

模板参数推导依赖于实际参数和形式参数之间的直接类型匹配。实际参数是初始化列表。它不匹配数组类型(充其量它可以匹配std::array中的内部原始数组,但语言规则不支持)。

相反,您可以只使用原始数组,即:

#include <stddef.h>
#include <array>

template<size_t N>
int b(int q, int const (&types)[N] )
{
    int r = q;
    for (int t : types)
    {
        r = r + t;
    }
    return r;
}

int main()
{
    b( 9, { 2, 3 } );
}

或者,如果在编译时不一定需要N,可以使用std::initializer\u列表。

还有许多其他可能相关的方法(例如,可变模板函数,或定义一个操作符来构建标准向量),但很难说什么适合您未公开的目的。

焦同
2023-03-14

C 17标准::数组类模板参数推导(CTAD)

从C 17开始,这个新的语言特性现在被标准库使用,现在允许我们省略模板类型,以便以下工作:

主要的cpp公司

#include <array>

int main() {
    std::array a{1, 2, 3};
}

而不是std::array

测试:

g++ -ggdb3 -O0 -std=c++17 -Wall -Wextra -pedantic -o main.out main.cpp

例如,如果我们设置std=c 14,它将无法编译为:

error: missing template arguments before ‘a’

在Ubuntu 18.04、GCC 7.5.0上测试。

 类似资料:
  • 如果我写这个 推断给关联的模板的类型是什么?换句话说,当字符串文字转换为时? 最好将其声明为 避免与所涉及模板的类型推断机制相关的问题?我会保持同样的优化?

  • 描述 (Description) 字符类[ad[mp]]匹配从a到d或m到p的任何字符。 例子 (Example) 以下示例显示了字符类匹配的用法。 package com.wenjiangs; import java.util.regex.Matcher; import java.util.regex.Pattern; public class CharacterClassDemo { p

  • 任务给你一个排序的整数数组arr。它包含几个唯一的整数(负、正或零)。 您的任务是找到最大的d,使得a b c=d,其中a、b、c和d是arr的不同元素。如果没有找到这样的元素d,则返回null。 例子: 对于arr=[2,3,5,7,12],输出应该是12(这个数组正确传递了我的函数) 对于arr=[-100,-1,0,7,101],输出应该是0(这个不通过) 我可以进行正数检查,但我的函数因负

  • 问题内容: 我正在学习Go,并且一直沉迷于Go旅游(exercise- stringer.go:https : //tour.golang.org/methods/7)。 这是一些代码: 所以我想出了is 的内部表示,所以散布算子起作用了。但我得到: 有没有搞错?字符串切片也不起作用,这是怎么回事? 编辑 :对不起,我的问题中有一个错误- 错误是关于type的,不是。我在玩代码,并且粘贴了错误的输

  • 问题内容: 我试图实施Miller- Rabin素数测试 ,并且对为什么中型数字(〜7位数字)花费如此长时间(> 20秒)感到困惑。我最终发现以下代码行是问题的根源: (其中,和都是相似的,但不相等的中号,是幂运算符,并且是模运算符) 然后,我尝试将其替换为以下内容: 相比之下,它几乎是瞬时的。 对于上下文,这是原始功能: 定时计算示例: 输出(与PyPy 1.9.0一起运行): 输出(在Pyth

  • 本文向大家介绍在数组中找到最大的d,使得C ++中的a + b + c = d,包括了在数组中找到最大的d,使得C ++中的a + b + c = d的使用技巧和注意事项,需要的朋友参考一下 假设我们有一组整数。我们必须找到一个数字“ d”,其中d = a + b + c,并且必须最大化(a + b + c),所有a,b,c和d都存在于集合中。该集合将至少容纳一个元素,最多可容纳1000个元素。每