알 수 없는 사용자 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;
}