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