함수 고급 주제

2025. 3. 27. 23:45Programming Languages/C++

4.4 함수 고급 주제

4.4.1 가변 인자 함수(Variadic Functions)

C 스타일:

#include <iostream>
#include <cstdarg>

// 가변 인자를 받아 합계 계산
double sum(int count, ...) {
    va_list args;
    va_start(args, count);
    
    double result = 0.0;
    for (int i = 0; i < count; i++) {
        result += va_arg(args, double);
    }
    
    va_end(args);
    return result;
}

int main() {
    std::cout << "합계 1: " << sum(3, 1.5, 2.5, 3.5) << std::endl;
    std::cout << "합계 2: " << sum(5, 1.0, 2.0, 3.0, 4.0, 5.0) << std::endl;
    
    return 0;
}

C++11 가변 인자 템플릿:

#include <iostream>

// 재귀 종료 함수
template<typename T>
T sum(T value) {
    return value;
}

// 가변 인자 템플릿 재귀 함수
template<typename T, typename... Args>
T sum(T first, Args... args) {
    return first + sum(args...);
}

int main() {
    std::cout << "합계 1: " << sum(1.5, 2.5, 3.5) << std::endl;
    std::cout << "합계 2: " << sum(1, 2, 3, 4, 5) << std::endl;
    std::cout << "혼합 합계: " << sum(1, 2.5, 3, 4.5) << std::endl;
    
    return 0;
}

4.4.2 함수 템플릿

타입에 독립적인 함수를 정의합니다:

#include <iostream>
#include <string>

// 단일 템플릿 매개변수
template<typename T>
T max(T a, T b) {
    return (a > b) ? a : b;
}

// 여러 템플릿 매개변수
template<typename T1, typename T2>
auto add(T1 a, T2 b) -> decltype(a + b) {  // 반환 타입 자동 추론
    return a + b;
}

int main() {
    std::cout << "int max: " << max(10, 20) << std::endl;
    std::cout << "double max: " << max(3.14, 2.71) << std::endl;
    std::cout << "char max: " << max('A', 'Z') << std::endl;
    std::cout << "string max: " << max(std::string("abc"), std::string("xyz")) << std::endl;
    
    std::cout << "int + double: " << add(5, 3.14) << std::endl;
    std::cout << "int + string: " << add(5, std::string(" 번째")) << std::endl;
    
    return 0;
}

4.4.3 함수 객체와 std::function (C++11)

다양한 호출 가능한 객체를 저장하고 사용합니다:

#include <iostream>
#include <functional>
#include <vector>
#include <algorithm>

// 일반 함수
int multiply(int a, int b) {
    return a * b;
}

// 함수 객체
class Adder {
public:
    int operator()(int a, int b) const {
        return a + b;
    }
};

int main() {
    // std::function으로 다양한 호출 가능한 객체 저장
    std::function<int(int, int)> operation;  // int(int, int) 시그니처의 함수
    
    // 일반 함수 할당
    operation = multiply;
    std::cout << "곱셈: " << operation(5, 3) << std::endl;
    
    // 함수 객체 할당
    operation = Adder();
    std::cout << "덧셈: " << operation(5, 3) << std::endl;
    
    // 람다 함수 할당
    operation = [](int a, int b) { return a - b; };
    std::cout << "뺄셈: " << operation(5, 3) << std::endl;
    
    // 함수 포인터 배열 대신 std::function 벡터 사용
    std::vector<std::function<int(int, int)>> operations;
    operations.push_back(multiply);
    operations.push_back(Adder());
    operations.push_back([](int a, int b) { return a - b; });
    
    for (const auto& op : operations) {
        std::cout << "결과: " << op(10, 5) << std::endl;
    }
    
    return 0;
}

'Programming Languages > C++' 카테고리의 다른 글

객체 지향 프로그래밍  (0) 2025.03.27
챕터4. 실습문제  (0) 2025.03.27
재귀(Recursion)  (0) 2025.03.27
함수 포인터와 함수 객체  (0) 2025.03.27
함수와 재귀  (0) 2025.03.27