爲了完整,還存在繼承的技術:
#include <cstddef>
using std::size_t;
template<size_t ...S> struct max_size_t;
template<size_t S1, size_t S2, size_t ...Rest>
struct max_size_t<S1, S2, Rest...>
: max_size_t<(S2 < S1) ? S1 : S2, Rest...> {
};
template<size_t S>
struct max_size_t<S> {
static const int value = S;
};
template<> struct max_size_t<> {
static const int value = 0;
};
template<typename ...T> struct max_size : max_size_t<sizeof(T)...> {};
// Using the same test-harness as Matthieu M:
#include <iostream>
int main() {
std::cout << "int: " << max_size<int>::value << "\n";
std::cout << "char, short, int: " << max_size<char, short, int>::value << "\n";
std::cout << "char, double, int: " << max_size<char, double, int>::value << "\n";
return 0;
}
在
liveworkspace
同樣。
儘管這不是一種方法,我會選擇來實現max_size
,這是非常方便的時候所需要的功能是它返回一個類型(高人爲的例子如下):
template<typename T1, typename T2, bool B=(sizeof(T1)>sizeof(T2))> struct selector;
template<typename T1, typename T2> struct selector<T1, T2, true> { using type = T1; };
template<typename T1, typename T2> struct selector<T1, T2, false> { using type = T2; };
template<typename T1, typename ...Rest> struct largest_type;
template<typename T1, typename T2, typename ...Rest>
struct largest_type<T1, T2, Rest...>
: largest_type<typename selector<T1, T2>::type, Rest...> {};
template<typename T1> struct largest_type<T1> { using type = T1; };
#include <iostream>
int main() {
static const unsigned long long u = 1ULL << 63;
std::cout << "int: " << typename largest_type<int>::type(u) << "\n";
std::cout << "int, double: " << typename largest_type<int, double>::type(u) << "\n";
std::cout << "short, float, long long: " << typename largest_type<short, float, long long>::type(u) << "\n";
return 0;
}
看到它here。
這是可用答案的最短和最清晰的解決方案。另一個重點是它不依賴Boost。 – mavam
@MatthiasVallentin:是的,我傾向於使用'constexpr',因爲它們比元編程技巧更具可讀性。更少的樣板,更多閱讀功能的習慣。 –