언어 정리/C++_개념_lib
가변인자
알 수 없는 사용자
2023. 12. 27. 19:07
1. cstdarg lib
- 인자의 갯수를 지정해야함
2. Template + initializer_list 라이브러리
- 인자 갯수 지정 X
- 인자의 자료형이 동일해야함
3. Template + 재귀함수 + fold_expression
- 인자 갯수 지정 X
- 인자의 자료형이 동일할 필요 X
- 마지막 인자를 처리해줘야 하는 번거로움 ( 오버라이딩 필요 )
1. cstdarg lib
#include <iostream>
#include <cstdarg>
void PrintNumbers(int count, ...) {
va_list args;
va_start(args, count);
for (int i = 0; i < count; ++i) {
int number = va_arg(args, int);
std::cout << number << ' ';
}
va_end(args);
std::cout << std::endl;
}
int main() {
PrintNumbers(5, 1, 2, 3, 4, 5);
return 0;
}
2. Template + initializer_list 라이브러리
- for (auto const& num : args) 설명 : 이 for문은 args에 담긴 모든 요소를 순회하면서 각 요소를 num이라는 변수로 참조
#include <iostream>
#include <initializer_list>
// 가변 인자를 받는 함수 정의
void printNumbers(std::initializer_list<int> args) {
for (auto const& num : args) {
std::cout << num << std::endl;
}
std::cout << std::endl;
}
int main() {
// 가변 인자를 사용하여 함수 호출
printNumbers({1, 2, 3, 4, 5});
// printNumbers({10, 20, 30});
return 0;
}
3. Template + 재귀함수 + fold_expression
#include <iostream>
// 가변 인자를 처리하는 기본 템플릿 함수
template<typename T>
void printVarArgs(const T& arg) {
std::cout << "aaaaaaaaaaa" << std::endl;
std::cout << arg << std::endl;
}
// 가변 인자를 처리하는 재귀 템플릿 함수
template<typename T, typename... Args>
void printVarArgs(const T& firstArg, const Args&... args) {
std::cout << "bbbbbbbbbbb" << std::endl;
std::cout << firstArg << std::endl;
printVarArgs(args...); // 나머지 인자에 대해 재귀 호출
}
int main() {
printVarArgs(1, 2.5, "three", 4.0f);
return 0;
}