扩展初始化列表和数组

时间:2012-11-25 20:39:53

标签: c++ arrays c++11 initializer-list

我有简单的功能,例如:

void fun(vector<int> vec)
{
//...
}

void fun(int* smth)
{
//...
}

当我在我的课程中写作时没有。

fun({2,3});

我用vector参数调用了我很有趣我知道它是在新的C ++扩展初始化列表中但是我想使用新的C ++并告诉编译器这只是一个int的数组我该怎么做呢?

编辑:

在1行中这样做会很好:)

2 个答案:

答案 0 :(得分:8)

你不能用一个数组初始化一个指针,因为一个指针不是一个数组(尽管某些情况下出现了这个,但事实并非如此)。

您必须将指针传递给预先存在的数组。或者,使用vector重载 - 当然,你更喜欢这个吗?!如果这两个函数做了不同的事情,那么为什么它们彼此重载(即为什么它重要)?

答案 1 :(得分:6)

制作别名模板

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}));
}