gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:10:37 24 4
gpt4 key购买 nike

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

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

...

foo({1, 2, 3})

我目前正在运行 GCC 4.8。

最佳答案

是的,我设法完成了以下工作(因为您允许类似的事情):

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)测试了这个,它们按预期工作。
这是在线版本at Stacked-Crooked.但是,这段代码无法在 Ideone 编译。由于我无法确定传递给 Ideone 编译器的选项,因此我放弃了该站点。


我无耻地从 @Pavel Minaev 中窃取了 make_array 函数对 How to emulate C array initialization “int arr[] = { e1, e2, e3, … }” behaviour with std::array? 的回答题。其他 make_array 建议导致我无法修复的编译错误。

make_array函数有局限性,请阅读the entire post ;特别是讨论std::array - if only it knew its size在 comp.lang.c++.moderated 上被引用。显然,获得一个合理的 make_array 是相当棘手的。 我不建议在生产代码中使用此答案中头脑简单的 make_array


如果大小是 std::initializer_list 的模板参数,您就不会有任何问题。因此问题 Why is the size not a template argument of std::initializer_list?

关于C++11 从初始化列表到数组参数的隐式转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17388317/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com