2 min read

C++ 두개중에 작은수를 유연하게 구하기

c++하면서 std::min을 사용하는데 이 함수의 문제는 min의 아규먼트의 타입이 같아야 합니다.

이러한 문제때문에 위의 C++ template 책에서는 이를 해결할려고 많은 시도를 보여줍니다.  결과적으로 막땅한 방법을 보여주지않고 max나 min의 함수를 이용해서 템플릿을 설명해줍니다. 결국 저만의 코드를 만들어 이를 해결해 볼려고했습니다. 코드는 다음과 같습니다.

#include <string>
#include <iostream>
#include <algorithm>
#include <vector>
#include <array>
#include <type_traits>

template<typename T>
struct SizeInBits {
	enum {
		Result = sizeof(T)
	};
};

template <class T1, class T2>
struct SizeBetter {
	using innerType = std::conditional_t<(SizeInBits<T1>::Result > SizeInBits<T2>::Result), T1, T2>;
};

template <class T1, class T2>
auto min(T1 t1, T2 t2) {
	typename SizeBetter<T1, T2>::innerType type[2]{ t1,t2 };
	return std::min(type[0], type[1]);
}
int main() {

	int a = { 10 };
	double b = { 30 };

	std::cout << min(a, b);
}

메타 프로그래밍을 좀 이용하였습니다.  원리는 비교할려는 타입의 크기를 비교하여 그중에 큰거를 컴파일시간에 선택하는겁니다. 물론 class인경우 예외처리는 안했지만 C++17의 concept이 들어오면 해결될것입니다.

구현하면서 원래 innerType을 삼한연산자로 구현을 했습니다만 삼항연산자는 아무리 해도 컴파일타임때 결과를 주지않아 conditional_t의 메타함수를 사용하였습니다.