:ループなし
#include <utility>
// Make Sequence
// =============
namespace Detail {
template <typename ResultSequence, typename IntegerSequence>
struct make_sequence;
template <typename ResultSequence, typename IndexType, IndexType...Indices>
struct make_sequence<ResultSequence, std::integer_sequence<IndexType, Indices...>>
{
template <typename Callable, typename...Args>
static constexpr ResultSequence apply(Callable&& fn, Args&&...args)
{
return { fn(Indices, std::forward<Args>(args)...) ... };
}
};
} // namespace Detail
template <typename ResultSequence, std::size_t N, typename Callable, typename...Args>
constexpr ResultSequence make_sequence(Callable&& fn, Args&&...args)
{
return Detail::make_sequence<ResultSequence, std::make_index_sequence<N>>::apply(fn, args...);
}
// Test
// ====
#include <array>
#include <iostream>
#include <vector>
#include <map>
int main() {
struct MissingConstexprLambda
{
constexpr std::pair<char, int> operator() (std::size_t i) {
return std::make_pair(char('a' + i), -1);
};
};
std::cout << "Array:\n";
constexpr auto a = make_sequence<std::array<std::pair<char, int>, 3>, 3>(MissingConstexprLambda());
for(const auto& p : a)
std::cout << p.first << " = " << p.second << '\n';
static_assert(std::get<1>(a).first == 'b', "");
auto lambda = [](std::size_t i) { return std::make_pair('a' + i, -1); };
std::cout << "Vector:\n";
auto v = make_sequence<std::vector<std::pair<char, int>>, 3>(lambda);
for(const auto& p : v)
std::cout << p.first << " = " << p.second << '\n';
std::cout << "Map:\n";
auto m = make_sequence<std::map<char, int>, 3>(lambda);
for(const auto& p : m)
std::cout << p.first << " = " << p.second << '\n';
}
'のstd :: vector'コンストラクタはこれをサポートしていない、'のstd ::イオタのようなものを使用' –
この質問を見てください:http://stackoverflow.com/q/12511711/5513245 と特に最初の2つの答え。彼らはおそらくあなたがしたいことを達成するのを助けることができます! – Jonathan
定型文やかなり複雑なラムダはありません。 –