Các N
nhu cầu được thời gian biên dịch liên tục, đó là với một bình thường for
vòng lặp là không thể.
Nhưng, có nhiều cách giải quyết. Ví dụ, lấy cảm hứng từ bài viết SO này , bạn có thể làm một cái gì đó như sau.
( Xem bản demo trực tiếp )
template<size_t N>
class A
{
public:
// make the member function public so that you can call with its instance
void someFunctions()
{
std::cout << N << "\n";
};
};
template<int N> struct AGenerator
{
static void generate()
{
AGenerator<N - 1>::generate();
A<N> a;
a.someFunctions();
}
};
template<> struct AGenerator<1>
{
static void generate()
{
A<1> a;
a.someFunctions();
}
};
int main()
{
// call the static member for constructing 100 A objects
AGenerator<100>::generate();
}
In 1
tới100
Trong c ++ 17 , phần trên có thể được giảm xuống thành một AGenerator
lớp mẫu duy nhất (nghĩa là có thể tránh chuyên môn hóa) if constexpr
. ( Xem bản demo trực tiếp )
template<std::size_t N>
struct AGenerator final
{
static constexpr void generate() noexcept
{
if constexpr (N == 1)
{
A<N> a;
a.someFunctions();
// .. do something more with `a`
}
else
{
AGenerator<N - 1>::generate();
A<N> a;
a.someFunctions();
// .. do something more with `a`
}
}
};
Đầu ra :
1
2
3
4
5
6
7
8
9
10
Trong trường hợp cung cấp phạm vi lặp, bạn có thể sử dụng như sau. ( Xem bản demo trực tiếp )
template<std::size_t MAX, std::size_t MIN = 1> // `MIN` is set to 1 by default
struct AGenerator final
{
static constexpr void generate() noexcept
{
if constexpr (MIN == 1)
{
A<MIN> a;
a.someFunctions();
// .. do something more with `a`
AGenerator<MAX, MIN + 1>::generate();
}
else if constexpr (MIN != 1 && MIN <= MAX)
{
A<MIN> a;
a.someFunctions();
// .. do something more with `a`
AGenerator<MAX, MIN + 1>::generate();
}
}
};
int main()
{
// provide the `MAX` count of looping. `MIN` is set to 1 by default
AGenerator<10>::generate();
}
Đầu ra giống như phiên bản trên.
N
cần phải cóconstexpr
nếu đó là biến vòng lặp không phải là trường hợp