C++에서 함수 반환형에 익명 구조체 (anonymous struct) 사용하기
예시:
#include <iostream>
std::tuple<int, double> get_data() {
return {10, 3.14};
}
int main() {
int x;
double y;
std::tie(x, y) = get_data(); // 구조화 바인딩 사용
std::cout << "x: " << x << ", y: " << y << std::endl;
return 0;
}
위 코드에서 get_data()
함수는 int
와 double
값을 튜플 (tuple)로 반환합니다. main()
함수에서는 구조화 바인딩을 사용하여 튜플의 각 값을 x
와 y
변수에 바인딩합니다.
익명 구조체 사용:
#include <iostream>
struct Data {
int x;
double y;
};
Data get_data() {
return {10, 3.14};
}
int main() {
Data data = get_data();
std::cout << "data.x: " << data.x << ", data.y: " << data.y << std::endl;
return 0;
}
위 코드에서는 get_data()
함수의 반환형을 명명된 구조체 Data
로 정의했습니다.
#include <iostream>
auto get_data() {
return struct {
int x;
double y;
} {10, 3.14};
}
int main() {
auto data = get_data();
std::cout << "data.x: " << data.x << ", data.y: " << data.y << std::endl;
return 0;
}
위 코드에서는 get_data()
함수의 반환형을 익명 구조체로 정의했습니다. 익명 구조체는 struct
키워드를 사용하여 정의하며, 멤버 변수와 초기화 값을 지정합니다.
장점:
- 코드 간결화: 명명된 구조체를 정의할 필요 없이 익명 구조체를 사용하여 함수 반환형을 간결하게 정의할 수 있습니다.
- 가독성 향상: 익명 구조체를 사용하면 반환 값의 의미를 명확하게 표현할 수 있습니다.
- 컴파일러 최적화: 컴파일러는 익명 구조체를 최적화하여 코드 효율성을 높일 수 있습니다.
주의 사항:
- 익명 구조체는 함수 내에서만 사용 가능합니다.
- 익명 구조체는 다른 함수와 상호 운용할 수 없습니다.
예제 코드
#include <iostream>
struct Data {
int x;
double y;
};
Data get_data() {
return {10, 3.14};
}
int main() {
Data data = get_data();
std::cout << "data.x: " << data.x << ", data.y: " << data.y << std::endl;
return 0;
}
#include <iostream>
auto get_data() {
return struct {
int x;
double y;
} {10, 3.14};
}
int main() {
auto data = get_data();
std::cout << "data.x: " << data.x << ", data.y: " << data.y << std::endl;
return 0;
}
구조화 바인딩 사용:
#include <iostream>
std::tuple<int, double> get_data() {
return {10, 3.14};
}
int main() {
int x;
double y;
std::tie(x, y) = get_data(); // 구조화 바인딩 사용
std::cout << "x: " << x << ", y: " << y << std::endl;
return 0;
}
익명 구조체와 구조화 바인딩 사용:
#include <iostream>
auto get_data() {
return struct {
int x;
double y;
} {10, 3.14};
}
int main() {
auto data = get_data();
int x;
double y;
std::tie(x, y) = data; // 구조화 바인딩 사용
std::cout << "x: " << x << ", y: " << y << std::endl;
return 0;
}
템플릿 함수 사용:
#include <iostream>
template <typename T>
T get_data() {
return T{10, 3.14};
}
int main() {
Data data = get_data<Data>();
std::cout << "data.x: " << data.x << ", data.y: " << data.y << std::endl;
return 0;
}
템플릿 함수와 구조화 바인딩 사용:
#include <iostream>
template <typename T>
T get_data() {
return T{10, 3.14};
}
int main() {
int x;
double y;
std::tie(x, y) = get_data<std::tuple<int, double>>(); // 구조화 바인딩 사용
std::cout << "x: " << x << ", y: " << y << std::endl;
return 0;
}
함수 반환형에 익명 구조체를 사용하는 대체 방법
#include <iostream>
struct Data {
int x;
double y;
};
Data get_data() {
Data data;
data.x = 10;
data.y = 3.14;
return data;
}
int main() {
Data data = get_data();
std::cout << "data.x: " << data.x << ", data.y: " << data.y << std::endl;
return 0;
}
튜플 (tuple) 사용:
#include <iostream>
std::tuple<int, double> get_data() {
return {10, 3.14};
}
int main() {
int x;
double y;
std::tie(x, y) = get_data();
std::cout << "x: " << x << ", y: " << y << std::endl;
return 0;
}
std::pair 사용:
#include <iostream>
std::pair<int, double> get_data() {
return {10, 3.14};
}
int main() {
int x;
double y;
std::tie(x, y) = get_data();
std::cout << "x: " << x << ", y: " << y << std::endl;
return 0;
}
클래스 사용:
#include <iostream>
class Data {
public:
int x;
double y;
Data() {
x = 10;
y = 3.14;
}
};
Data get_data() {
return Data();
}
int main() {
Data data = get_data();
std::cout << "data.x: " << data.x << ", data.y: " << data.y << std::endl;
return 0;
}
#include <iostream>
auto get_data() {
return []() -> std::tuple<int, double> {
return {10, 3.14};
};
}
int main() {
int x;
double y;
std::tie(x, y) = get_data()();
std::cout << "x: " << x << ", y: " << y << std::endl;
return 0;
}
장단점 비교:
방법 | 장점 | 단점 |
---|---|---|
익명 구조체 | 코드 간결화 | 가독성 저하, 익명 구조체 외부에서 사용 불가 |
명명된 구조체 | 가독성 향상, 익명 구조체 외부에서 사용 가능 | 코드 복잡화 |
튜플 | 간결하고 효율적 | 가독성 저하 |
std::pair | 튜플보다 가독성 향상 | 튜플보다 기능 제한적 |
클래스 | 유연하고 확장 가능 | 코드 복잡화 |
람다 함수 | 코드 간결화, 익명 구조체 외부에서 사용 가능 | 코드 복잡화, 익명 구조체보다 느릴 수 있음 |
c++ structured-bindings anonymous-struct