これには組み込みのソリューションはありません。それで全部です。
それは次のようにあなたがあなた自身のために似た何かを定義することができます。
#include<functional>
#include<cstddef>
#include<array>
#include<iostream>
template<std::size_t... I>
constexpr auto seq(std::integer_sequence<std::size_t, I...>) {
return std::array<std::size_t, sizeof...(I)>{ I... };
}
template<std::size_t N>
constexpr auto seq() {
return seq(std::make_index_sequence<N>());
}
int main() {
for(auto i: seq<10>()) {
std::cout << i << std::endl;
}
}
あなたがNに0以外の範囲に対処したい場合は、代わりにこれを行うことができます:
#include<functional>
#include<cstddef>
#include<array>
#include<iostream>
template<std::size_t N, std::size_t... I>
constexpr auto seq(std::integer_sequence<std::size_t, I...>) {
return std::array<std::size_t, sizeof...(I)>{ (N+I)... };
}
template<std::size_t N, std::size_t M, std::enable_if_t<(N<M)>* = nullptr>
constexpr auto seq() {
return seq<N>(std::make_index_sequence<M-N>());
}
int main() {
for(auto i: seq<3, 7>()) {
std::cout << i << std::endl;
}
}
を
このソリューションにはC++ 14リビジョンが必要です。
データ構造をインスタンス化する必要はありません別の解決策は、次のいずれかです。
#include<functional>
#include<cstddef>
#include<array>
#include<iostream>
#include<utility>
template<std::size_t N, typename F, std::size_t... I>
constexpr void seq(F &&f, std::integer_sequence<std::size_t, I...>) {
int arr[] = { (std::forward<F>(f)(I+N), 0)... };
}
template<std::size_t N, std::size_t M, typename F, std::enable_if_t<(N<M)>* = nullptr>
constexpr void seq(F &&f) {
seq<N>(std::forward<F>(f), std::make_index_sequence<M-N>());
}
int main() {
seq<3, 7>([](int i){
std::cout << i << std::endl;
});
}
そうarr
は、コンパイラによって一掃されますが、それはのためのように少ないビットを探しますループ。
可能ですか?はい、もちろん。内蔵ですか?未だに。 – ildjarn
これはむしろMatlabやJavaの 'for'ループのように見えますが、C++では見えません。 – Polb
私は*問題が解決されていることを知りたいと思っています*それは前者ではなく後者をやりやすくします。 [Range-for](http://en.cppreference.com/w/cpp/language/range-for)は、次のようなものです: 'begin()'で範囲を公開しているオブジェクトに対するforループ構造、および'end()'構造体です。あなたが簡単な数値シーケンスでそれをしたいのであれば、それを行うオブジェクトを書くのは難しくありません。しかし、再び、*なぜ迷惑? – WhozCraig