이 글에서는 C++ STL에서 제공하는 ratio_equal() 함수의 동작 원리, 문법, 그리고 실제 예제를 통해 사용법을 자세히 살펴보겠습니다.
ratio_equal 템플릿이란?
ratio_equal은 C++ STL에 내장된 템플릿으로, <ratio> 헤더 파일에 정의되어 있습니다. 이 템플릿은 두 비율(ratio)을 서로 비교하는 데 사용되며, 두 개의 매개변수를 받아 해당 비율들이 같은지 여부를 검사합니다.
예를 들어 1/2와 3/6은 분자와 분모의 숫자 자체는 다르지만 약분하면 동일한 값입니다. 이처럼 표기 형태가 달라도 실제 값이 같은 경우를 판별하기 위해 C++에서는 ratio_equal이라는 내장 템플릿을 제공하며, 두 비율이 같으면 true, 다르면 false를 반환합니다.
따라서 두 비율의 동등성을 확인하고 싶을 때 복잡한 비교 로직을 직접 작성하는 대신 이 템플릿을 활용하면 코드를 훨씬 간결하고 안전하게 작성할 수 있습니다.
문법
template <class ratio1, class ratio2> ratio_equal;
매개변수
이 템플릿은 다음 매개변수를 받습니다.
ratio1, ratio2 − 서로 같은지 검사하고자 하는 두 비율입니다.
반환값
두 비율이 같으면 true를 반환하고, 그렇지 않으면 false를 반환합니다.
입력
typedef ratio<3, 6> ratio1;
typedef ratio<1, 2> ratio2;
ratio_equal<ratio1, ratio2>::value;
출력
true
입력
typedef ratio<3, 9> ratio1;
typedef ratio<1, 2> ratio2;
ratio_equal<ratio1, ratio2>::value;
출력
false
예제 1: 두 비율이 같은 경우
#include <iostream>
#include <ratio>
using namespace std;
int main(){
typedef ratio<2, 5> R_1;
typedef ratio<10, 25> R_2;
//두 비율이 같은지 확인
if (ratio_equal<R_1, R_2>::value)
cout<<"Ratio 1 and Ratio 2 are equal";
else
cout<<"Ratio 1 and Ratio 2 aren't equal";
return 0;
}
출력
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
Ratio 1 and Ratio 2 are equal
2/5와 10/25는 약분하면 모두 2/5이므로 두 비율은 같다고 판단되어 true가 반환됩니다.
예제 2: 두 비율이 다른 경우
#include <iostream>
#include <ratio>
using namespace std;
int main(){
typedef ratio<2, 5> R_1;
typedef ratio<1, 3> R_2;
//두 비율이 같은지 확인
if (ratio_equal<R_1, R_2>::value)
cout<<"Ratio 1 and Ratio 2 are equal";
else
cout<<"Ratio 1 and Ratio 2 aren't equal";
return 0;
}
출력
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
Ratio 1 and Ratio 2 aren't equal
2/5와 1/3은 값이 서로 다르므로 false가 반환되어 else 블록의 문장이 실행됩니다.
예제 3: 분모가 0인 경우
그렇다면 분모에 0을 입력하면 어떻게 될까요? 아래 코드를 통해 확인해 보겠습니다.
#include <iostream>
#include <ratio>
using namespace std;
int main(){
typedef ratio<2, 5> R_1;
typedef ratio<1, 0> R_2;
//두 비율이 같은지 확인
if (ratio_equal<R_1, R_2>::value)
cout<<"Ratio 1 and Ratio 2 are equal";
else
cout<<"Ratio 1 and Ratio 2 aren't equal";
return 0;
}
출력
위 코드를 컴파일하면 다음과 같은 오류가 발생합니다.
/usr/include/c++/6/ratio:265:7: error: static assertion failed: denominator cannot be zero
static_assert(_Den != 0, "denominator cannot be zero");
ratio 템플릿은 내부적으로 static_assert를 사용하여 분모가 0이 되는 것을 컴파일 시점에 차단합니다. 즉, 프로그램이 실행되기 전에 이미 오류가 발생하므로, 잘못된 비율 정의를 조기에 발견할 수 있다는 장점이 있습니다.
정리
ratio_equal은 C++11부터 도입된 컴파일 타임 유리수 연산(<ratio>) 라이브러리의 일부로, 모든 비교 연산이 컴파일 시점에 수행됩니다. 따라서 런타임 오버헤드 없이 두 비율의 동등성을 안전하게 검사할 수 있으며, 단위 변환(duration 등)과 관련된 메타프로그래밍에서 유용하게 활용됩니다.