C++11 从初始化列表到数组参数的隐式转换

2023-12-23

在C++11中,是否可以做类似以下的事情?

template<typename T, size_t N>
void foo(array<T, N> src) { ... }

...

foo({1, 2, 3})

我目前正在运行 GCC 4.8。


Yes,我设法得到了以下工作(因为你允许相似的东西):

template<typename T, size_t N>
void foo(array<T, N> src) { ... }

...

foo('a', 'b');
foo(1, 2, 3);

具体方法如下:

#include <array>
#include <iostream>
#include <utility>
using namespace std;

template<typename T, unsigned long N>
void foo(array<T,N> src) { 

  for (auto e : src)
    cout << e << endl;
}

template<class T, class... Tail>
auto make_array(T head, Tail... tail) -> std::array<T, 1 + sizeof...(Tail)>
{
     std::array<T, 1 + sizeof...(Tail)> a = {{ head, tail ... }};
     return a;
}

template<class T, class... Tail> 
void foo(T&& head, Tail&&... values) {

    foo(make_array(std::forward<T>(head), std::forward<Tail>(values)...));
}

int main() {

  foo('a', 'b');

  foo(1, 2, 3);
}

我已经用 gcc 4.7.2 和 clang 3.4 (trunk 184647) 对此进行了测试,它们按预期工作。
这是一个在线版本在堆叠弯曲。 http://coliru.stacked-crooked.com/view?id=6763ae9f3d248efc1e32110937109c21-f674c1a6d04c632b71a62362c0ccfc51然而,这段代码无法在 Ideone 上编译。由于我无法弄清楚传递给 Ideone 编译器的选项,我已经放弃了该网站。


我无耻地偷了make_array函数来自@帕维尔·米纳耶夫 https://stackoverflow.com/users/111335/pavel-minaev的回答如何使用 std::array 模拟 C 数组初始化“int arr[] = { e1, e2, e3, … }”行为? https://stackoverflow.com/a/6114299/341970问题。另一个make_array建议导致了我无法修复的编译错误。

This make_array功能有限制,请阅读整个帖子 https://stackoverflow.com/q/6114067/341970;特别是讨论std::array - 如果它知道它的大小就好了 https://groups.google.com/forum/#!topic/comp.lang.c++.moderated/8aWhRRsAO-w在 comp.lang.c++.moderated 上被引用。显然,得到一个合理的make_array是相当棘手的。我不推荐头脑简单的人make_array在这个答案中将在生产代码中使用。


如果大小是模板参数,则不会有任何问题std::initializer_list。因此问题为什么大小不是 std::initializer_list 的模板参数? https://stackoverflow.com/q/7108425/341970

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++11 从初始化列表到数组参数的隐式转换 的相关文章

  • 用于在 n LSBits 之后清除 m 位的掩码

    我在一次采访中被问到这个问题 要清除 16 位整数的 n 位之后的 m 位 假设数字是 10010010010100101 清除 LSBit 中 5 位后的三位 之前 1001100111011001 之后 1001100100011001
  • Bjarne Stroustrup 的 C++ 编程和实践第 2 版中的使用单参数排序

    我正在阅读 Bjarne Stroustrup new C PP 第二版 他在其中使用了排序方法 sort someVector 使用此方法编译代码时出现以下错误 3 IntelliSense 没有重载函数 sort 的实例与参数列表匹配
  • WriteLine 与类

    我正在制作一个 SchoolApp 程序来学习 C 并且我正在尝试实现以下主要功能 namespace SchoolApp class Program public static void Main string args School s
  • 如何确定一个值是否在某个范围内?

    我对 C 语言比较陌生 不幸的是我必须在学校做这件事 而且我在最简单的练习中遇到了问题 这里我必须检查一个数字是否在某个区间内 例如4到6之间 我是这样制作的 include
  • 按文件创建日期排序(并枚举)目录列表?

    所以我有这个例程 public static IEnumerable
  • Unity C# 嵌套 IEnumerator

    在我的代码中 我嵌套了 IEnumerator 方法 如下所示 private IEnumerator PerformRequest string url Doing stuff UnityWebRequest request UnityW
  • cppcheck 找不到包含文件

    cppcheck 甚至找不到标准标头 例如 iostream 有任何想法吗 我正在使用 Ubuntu 11 04 和存储库中的 cppcheck cppcheck 在 Mac 和 Linux 上查找标准包含头确实很糟糕 幸运的是 您可以取消
  • C 中的结构和联合,确定大小和访问成员

    All 这是一个关于 Unions 的例子 我觉得它令人困惑 struct s1 int a char b union struct char c long d long e var 考虑到char是1个字节 int是 2 个字节并且lon
  • C# 检测关闭应用程序

    我正在尝试创建任务栏替换 并且我想要每个正在运行的应用程序都有一个按钮 public void AddBtn string name Button newButton new Button this Controls Add newButt
  • C# 从mp4文件中提取mp3文件

    有没有简单的方法从 mp4 文件中提取 mp3 文件 我已经尝试过更改文件扩展名 但这不允许我编辑 mp3 描述 谢谢你 Use Xabe FFmpeg https xabe net product xabe ffmpeg 它是免费的 非商
  • 使用 jni 从 C 调用 java 函数

    我正在编写一个简单的程序来从我的 C 程序调用 Java 函数 以下是我的代码 include
  • 如何使用 mongo-cxx-driver 设置 Visual Studio 项目设置?

    我已经在 Windows 10 上成功构建了用于 C 的 MongoDB 驱动程序版本 3 0 3 CMAKE INSTALL PREFIX C mongo cxx driver 但我不知道如何在 Visual Studio 2015 中设
  • 上传带有附加信息的文件(Angular 8 到 C# Core 3)

    我终于弄清楚如何将文件从 Angular 8 前端上传到 C Net Core 3 0 后端 API 控制器 但为了获得我完全需要的内容 我还有一个类定义了用户设置的文件内容 例如标题行 列值等 也需要传入 在客户端 我只需创建一个 For
  • 在 C# 中使用 Nsubstitute 模拟具有固定参数的可选参数的函数返回 null

    我一直在尝试模拟一个包含带有固定参数的可选参数的函数 但每次我得到一个空值 这是我在接口中定义的函数 我想模拟它 List GetEntitiesByIDs List
  • 处理多个自动重定向的正确方法是什么?

    我有一个网站 基本上允许客户构建一个包含可配置项目的购物车 用户将选择一个项目 系统会提示他们选择他们想要的第一个选项 然后他们将被发送到第二个步骤 在那里他们选择第二个选项 等等 步骤数和选项数是可变的 因为它们是由客户定义的 通常该项目
  • 隐式构造函数和默认构造函数有什么区别?

    这是非常微不足道的 但是捷克语 我的母语 不区分隐式和默认 所以我对一些捷克语翻译感到困惑 隐式和默认构造函数或构造函数调用之间有什么区别 struct Test Test int n 0 您能用这些术语描述以下语句的作用吗 Test t1
  • 显式移动构造函数

    尝试编译以下代码 struct Foo explicit Foo void explicit Foo Foo rhs Foo bar void return Foo 出现以下错误 调用 Foo 的隐式删除复制构造函数 嗯 很明显复制者被隐式
  • C# 中 PHP 的快速解析

    我需要用 C 解析 PHP 文件 我们本质上要求另一个国家的一些开发人员上传 PHP 文件 上传后我们需要检查 php 文件并获取所有方法和类 函数等的列表 我想过使用正则表达式 但我无法确定一个函数是否属于一个类等 所以我想知道是否已经有
  • 简单的 C# 屏幕共享应用程序

    我希望用 C 创建一个非常基本的屏幕共享应用程序 无需远程控制 我只希望用户能够将他们的屏幕广播到网络服务器 我应该如何实施这个 任何指向正确方向的指针将不胜感激 它不需要很高的 FPS 甚至更新 5 秒左右就足够了 您认为每隔 5 秒上传
  • 在实体框架中对连接字符串进行硬编码

    我知道很多人认为对连接信息进行硬编码是一个坏主意 但我有一个特定的情况需要这样做 请不要贬低我 因为你认为这是一个坏主意 再次 非常具体的情况 使用下面的代码 我在 LINQ 语句上收到以下错误 底层提供程序在打开时失败 我已经独立测试了连

随机推荐