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의 메타함수를 사용하였습니다.