在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({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);
}
make_array
函数。其他的make_array
建议会导致编译错误,我无法修复。make_array
函数有限制,请阅读整篇文章;特别是comp.lang.c++.moderated上的讨论std::array——如果它只知道它的大小。显然,获得一个合理的make_array
非常棘手。我不建议在生产代码中使用这个简单的make_array
。
std::initializer_list
的模板参数,则不会遇到任何问题。因此,提出了问题为什么大小不是std::initializer_list的模板参数?
template<typename T>
void foo(const std::vector<T>& src) { ...your code here... }
template<typename T>
void foo(const std::initializer_list<T>& src) { foo(std::vector<T>(src)); }
foo({1,2,3}); // Compiles
但遗憾的是,由于initializer_list
的大小不是模板参数,我想不到一种方法来使其推导并将数组大小从initializer_list
中以与类型相同的方式向前传递。
您可以直接使用初始化列表来实现这种语法。例如:
#include <iostream>
#include <initializer_list>
void foo(std::initializer_list<int> il) {
for (auto i: il)
std::cout << i < std::endl;
}
int main() {
foo({1,2,3});
}
template <typename T>
void foo(std::initializer_list<T> il) {
...
foo
设计成适用于任何容器的模板呢? - user4945014template <typename T, size_t N>
void foo(T const (&x)[N]) {
// x is [1, 2, 3], N = 3
}
int main() {
foo({1, 2, 3});
return 0;
}
const
允许这种隐式转换?如果有的话,请分享一下。 - namezero
make_array
函数... :) - Joachim Isaksson