C++ 扩展初始值设定项列表和数组

C++ 扩展初始值设定项列表和数组,c++,arrays,c++11,initializer-list,C++,Arrays,C++11,Initializer List,我有一些简单的功能,例如: void fun(vector<int> vec) { //... } void fun(int* smth) { //... } 它用向量参数来调用我,我知道它是在新的C++扩展的初始化列表中,但是我想使用新的C++,告诉编译器这只是一个int数组,我怎么做? 编辑: 最好在1行中完成:)不能用数组初始化指针,因为指针不是数组(尽管在某些情况下出现这种情况,但它不是) 您必须传递一个指向预先存在的数组的指针。或者,使用向量重载-当然,你还是喜欢这个吗

我有一些简单的功能,例如:

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

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

它用向量参数来调用我,我知道它是在新的C++扩展的初始化列表中,但是我想使用新的C++,告诉编译器这只是一个int数组,我怎么做? 编辑:


最好在1行中完成:)

不能用数组初始化指针,因为指针不是数组(尽管在某些情况下出现这种情况,但它不是)

您必须传递一个指向预先存在的数组的指针。或者,使用
向量
重载-当然,你还是喜欢这个吗?!如果这两个函数做的事情不同,那么为什么它们会互相重载(即为什么这很重要)?

制作一个别名模板

template<typename T>
using identity = T;
模板
使用恒等式=T;
这样你就可以写作了

fun(identity<int[]>{1,2});
fun(身份{1,2});

但这不是一个好的编程,因为在函数中,您无法知道指向的数组的大小。如果函数应该使用元素列表,则应该显式地将其传递给函数。如果您想处理数组,请考虑使用诸如<代码> LVM::ArrayRef < /C> >或创建自己的

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}));
}
struct数组\u ref{
公众:
模板
数组\u ref(常量标识&n)
:开始(n),结束(n+n)
{ }
数组_ref(常数std::vector&n)
:开始(n.data()),结束(n.data()+n.size())
{ }
公众:
int const*begin()const{return begin;}
int const*end()const{return end_;}
int size()常量{return end.-begin.}
私人:
int const*开始;
int const*end_u2;;
};
虚无乐趣(数组\参考数组){
...
}
int main(){
fun(数组_-ref(恒等式{1,2}));
}

> C++中不能有临时数组,幸运的是,“KeRek不正确。”我惹恼了马德里的委员会,直到他们接受了C++11。
最好用一行:)
为什么会这样?@johanneschaub-litb:我从来不知道-这是标准的哪一部分?@KerrekSB没有特别的部分。这并不是不允许的。我在电子邮件中说,有几段并没有禁止使用临时数组,而其他几段相互矛盾。并决定取消所有禁止或妨碍临时数组的规则。将指针传递到先前存在的数组将使用数组初始化指针,不是吗?@Johanneschaub litb:否。它将使用数组第一个元素的地址填充指针,在使用此指针初始化参数指针之前。在任何阶段都不能使用实际数组本身以外的数组初始化任何内容。@Johanneschaub litb:没问题。但这应该不是必需的。向量重载应该做同样的事情,所以OP应该对使用它感到满意@指示灯否矢量重载将分配动态内存。在某些环境中,这是一个禁忌。您认为在这种情况下,这可能是一个严肃的考虑因素吗?@LightnessRacesinOrbiti我不知道。
array\u ref
basic\u string\u ref
是,所以希望我们能在C++14中看到它们。:-)
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}));
}