我有简单的功能,例如:
void fun(vector<int> vec)
{
//...
}
void fun(int* smth)
{
//...
}
不,当我在我的程序中编写时。
fun({2,3});
它让我觉得向量参数很有趣,我知道它在新的 C++ 扩展初始化列表中,但我想使用新的 C++ 并告诉编译器这只是一个 int 数组,我该怎么做?
编辑:
最好在 1 行中完成 :)
我有简单的功能,例如:
void fun(vector<int> vec)
{
//...
}
void fun(int* smth)
{
//...
}
不,当我在我的程序中编写时。
fun({2,3});
它让我觉得向量参数很有趣,我知道它在新的 C++ 扩展初始化列表中,但我想使用新的 C++ 并告诉编译器这只是一个 int 数组,我该怎么做?
编辑:
最好在 1 行中完成 :)
您不能用数组初始化指针,因为指针不是数组(尽管在某些情况下会出现这种情况,但事实并非如此)。
您必须将指针传递给预先存在的数组。或者,使用vector
重载——当然,你还是更喜欢这个?!如果这两个函数做不同的事情,那么为什么它们会互相重载(即为什么重要)?
制作别名模板
template<typename T>
using identity = T;
所以你可以写
fun(identity<int[]>{1,2});
虽然这不是好的编程,因为在您的函数中您无法知道指向的数组的大小。如果该函数应该与元素列表一起使用,则应将其显式传递给该函数。如果要处理数组,请考虑使用类似的东西llvm::ArrayRef<T>
或创建自己的
struct array_ref {
public:
template<int N>
array_ref(const identity<int[N]> &n)
:begin_(n), end_(n + N)
{ }
array_ref(const std::vector<int>& n)
:begin_(n.data()), end_(n.data() + n.size())
{ }
public:
int const *begin() const { return begin_; }
int const *end() const { return end_; }
int size() const { return end_ - begin_; }
private:
int const *begin_;
int const *end_;
};
void fun(array_ref array) {
...
}
int main() {
fun(array_ref(identity<int[]>{1,2}));
}