我會先轉儲代碼,稍後在必要/適當的地方添加引用和註釋。如果結果與您正在尋找的結果稍微接近,請留下評論。
指數包擴展的技巧(這裏要求應用發生器),由Xeo,從this answer,修改爲使用std::size_t
而不是unsigned
。
#include <cstddef>
// by Xeo, from https://stackoverflow.com/a/13294458/420683
template<std::size_t... Is> struct seq{};
template<std::size_t N, std::size_t... Is>
struct gen_seq : gen_seq<N-1, N-1, Is...>{};
template<std::size_t... Is>
struct gen_seq<0, Is...> : seq<Is...>{};
發電機功能:
#include <array>
template<class Generator, std::size_t... Is>
constexpr auto generate_array_helper(Generator g, seq<Is...>)
-> std::array<decltype(g(std::size_t{}, sizeof...(Is))), sizeof...(Is)>
{
return {{g(Is, sizeof...(Is))...}};
}
template<std::size_t tcount, class Generator>
constexpr auto generate_array(Generator g)
-> decltype(generate_array_helper(g, gen_seq<tcount>{}))
{
return generate_array_helper(g, gen_seq<tcount>{});
}
用例:
// some literal type
struct point
{
float x;
float y;
};
// output support for `std::ostream`
#include <iostream>
std::ostream& operator<<(std::ostream& o, point const& p)
{ return o << p.x << ", " << p.y; }
// a user-defined generator
constexpr point my_generator(std::size_t curr, std::size_t total)
{
return {curr*40.0f/(total-1), curr*20.0f/(total-1)};
}
int main()
{
constexpr auto first_array = generate_array<5>(my_generator);
constexpr auto second_array = generate_array<10>(my_generator);
std::cout << "first array: \n";
for(auto p : first_array)
{
std::cout << p << '\n';
}
std::cout << "========================\n";
std::cout << "second array: \n";
for(auto p : second_array)
{
std::cout << p << '\n';
}
}
來源
2013-09-25 23:05:19
dyp
'的std :: VECTOR'不是文本類型,並且因此不能用於C++ 11'constexpr'。 C++ 11的'array'類型缺少'constexpr'訪問器,因此在'constexpr'函數中的使用也受到限制。如果您沒有一些C++ 1y庫/編譯器支持,我建議使用自定義數組類型。 – dyp
@DyP - 你能舉一個例子嗎? – nbubis
如果你添加了一些你想要做的細節,會更有用;) – dyp