是否无法将 std::vector<T> 转换为 std::initializer_list<T> ?

Adr*_*ian 5 c++ vector stdvector initializer-list c++11

我本来以为有人能做到这一点?然而,情况似乎并非如此。为什么?或者我做错了什么?

#include <vector>
#include <initializer_list>
#include <iostream>

using namespace std;

void fn(std::initializer_list<int> i)
{
  for(int ivalue:i)
  {
    cout << ivalue << endl;
  }
}

int main()
{
  fn({1,2,3});
  fn(vector<int>{4,5,6})
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

演示

我问这个问题的原因是因为我有一个类需要一个初始化列表,并且我是从它派生的,但需要在将初始化列表传递到基类之前对其进行处理。我怎样才能做到这一点?

Bar*_*rry 3

有时旧的方法是最好的方法:只需传入范围:

void fn(std::initializer_list<int> i) {
    fn(i.begin(), i.end());
}

template <typename It>
void fn(It it, It end) {
    for (; it != end; ++it) {
        std::cout << *it << std::endl;
    }
}

fn({1, 2, 3});

std::vector<int> v{1, 2, 3};
fn(std::begin(v), std::end(v));
Run Code Online (Sandbox Code Playgroud)

对于您的具体问题...采用初始值设定项列表的构造函数必须对其进行迭代,只需将该操作委托给迭代器对构造函数即可:

Foo(std::initializer_list<T> init)
: Foo(init.begin(), init.end())
{ }

template <typename It>
Foo(It it, It end)
{
    // here the magic happens
}
Run Code Online (Sandbox Code Playgroud)