함수 고급 주제
2025. 3. 27. 23:45ㆍProgramming 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 |