簡體   English   中英

使用std :: initializer_list參數將基本數組傳遞給函數

[英]Passing primitive array to function with std::initializer_list argument

使用以std :: initializer_list作為參數的函數,如下所示

int sumOf(std::initializer_list<int> numbers) {
    int sum = 0;  
    for (auto x : numbers) {
        sum += x;
    }
    return sum;
}

此代碼有效

auto sum = sumOf({ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 });

但不是這個

 int i[]  = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
 auto x = sumOf(i);

為什么第二種形式不起作用? 還是我做錯了什么?

編輯:
在std :: intializer_list的gcc 4.7.2實現中,intializer_list的構造函數是私有的,編譯器需要傳遞數組的大小。

  // The compiler can call a private constructor.
  constexpr initializer_list(const_iterator __a, size_type __l)
  : _M_array(__a), _M_len(__l) { }

我猜編譯器在某些情況下無法根據變量“ i”來判斷數組的大小。 如果是這樣,編譯器(?)無法支持將靜態數組傳遞給intializer_list。

i不是initializer_list initializer_list不是“靜態數組”的簡寫形式。 這是一個特殊的對象,只能通過使用支撐初始列表(即{...}語法)創建(在復制構造之外)。

當你做int i[] = {...}; 您正在對數組執行聚合初始化。 i是一個int數組,而不是一個initializer_list

您想要的是一個模板函數,該函數可以將您可以使用基於范圍的所有內容用於:

template<typename Rng>
int sumOf(const Rng &numberRange) {
    int sum = 0;  
    for (auto x : numberRange) {
        sum += x;
    }
    return sum;
}

您可以像以前很多人所使用的那樣,執行索引元組把戲

template<int N, int ...X>
struct I : struct I<N-1, N, X...> {};

template<int X...>
struct I<0, X...> {
  typedef I type;
};

template<typename F, typename T, int N, int ...X>
decltype(f(std::declval<std::initializer_list<T>>()))
make_list(T const (&a)[N], F f, I<X...>) 
{
   return f(std::initializer_list<T>{a[X]...});
}

template<typename F, typename T, int N>
decltype(f(std::declval<std::initializer_list<T>>()))
make_list(T const(&a)[N], F f) {
   return make_list(a, f, typename I<N-1>::type());
}

使用簡單

make_list(i, &sumOf);

或使用lambda

make_list(i, [](std::initializer_list<int> x) {
  return sumOf(x);
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM