N
চাহিদা কম্পাইল-টাইম ধ্রুবক, যা সঙ্গে একটি স্বাভাবিক হতে for
লুপ সম্ভব নয়।
তবে, অনেকগুলি কাজের সুযোগ রয়েছে। উদাহরণস্বরূপ, এই এসও পোস্ট দ্বারা অনুপ্রাণিত , আপনি নিম্নলিখিত মত কিছু করতে পারেন।
( একটি লাইভ ডেমো দেখুন )
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();
}
প্রিন্ট 1
করুন100
ইন C ++ 17 , উপরোক্ত একটি একক ফর্মা কমে যাবে AGenerator
বর্গ (অর্থাত বিশেষজ্ঞতা এড়ানো যায়) ব্যবহার করেif constexpr
। ( একটি লাইভ ডেমো দেখুন )
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`
}
}
};
আউটপুট :
1
2
3
4
5
6
7
8
9
10
পুনরাবৃত্তির পরিসীমা সরবরাহের ক্ষেত্রে, আপনি নিম্নলিখিতটি ব্যবহার করতে পারেন।( একটি লাইভ ডেমো দেখুন )
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();
}
উপরের সংস্করণ হিসাবে একই আউটপুট।
N
করা প্রয়োজনconstexpr
যা যদি এটি একটি লুপ পরিবর্তনশীল যে ক্ষেত্রে হয়