N
요구는 통상 함께 컴파일 시정 될 for
루프가 불가능하다.
그러나 많은 해결 방법이 있습니다. 예를 들어,이 SO post 에서 영감을 받아 다음과 같은 작업을 수행 할 수 있습니다.
( 실시간 데모 참조 )
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
있는 것이 그렇지 않다 루프 변수 인 경우