每个C++都可以使用匿名集合吗?

Jan*_*Jan 0 c++ c++11

我正在尝试将一些Python listbrrehension像语法一样放入我的C++中.我正在使用Visual Studio 2013.

举个例子,假设我想模拟(python):for i in [1,5]: sum+=i 假设之前初始化的和为零.

到目前为止我能做的最好的是:

int a[]={1,5}, sum=0;
for each (int i in a) sum+=i;
Run Code Online (Sandbox Code Playgroud)

我会喜欢这样的东西:

for each (int i in {1,5}) sum+=i;
Run Code Online (Sandbox Code Playgroud)

但显然,这不会编译; 尝试在{1,5}处插入int或int []对我来说无济于事.

使用{1,5}来初始化矢量:std::vector<int>{1,5}有效,但有点刮风; 而且我不需要构造和销毁矢量的开销.

我错过了什么,或者这在C++ 11(以及可能是C++ 14)中是不可能的?

bst*_*our 5

你可以做类似的事情std::initializer_list.以下代码在gcc 4.8.2上编译

#include <iostream>

int main() {
    int sum = 0;
    for (auto x : {1,5}) sum += x;
    std::cout << sum << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

编辑:如果要使用范围而不是硬编码集合,可以使用以下内容:

template <int L, int H, int... Nums> struct make_seq_impl {
    constexpr std::initializer_list<int> operator()() const {
        return make_seq_impl<L + 1, H, Nums..., L>{}();
    }
};

template <int H, int... Nums> struct make_seq_impl<H, H, Nums...> {
    constexpr std::initializer_list<int> operator()() const {
        return { Nums..., H };
    }
};

template <int L, int H>
inline constexpr std::initializer_list<int> make_seq() {
    return make_seq_impl<L, H>{}();
}

int main() {
    int sum = 0;
    // 1 + 2 + 3 + 4 + 5
    for (auto x : make_seq<1, 5>()) sum += x;
}
Run Code Online (Sandbox Code Playgroud)