I saw this question on Stack Overflow some times ago, it amounted to emulating a switch() statement in template code. Then recently I saw a nice example of doing this.
First, the oldskool style, using Boost and C++98:
template <int N>
struct shortest_fitting_int
{
BOOST_STATIC_ASSERT(N > 0);
BOOST_STATIC_ASSERT(N <= sizeof(int64_t));
typedef
typename boost::conditional< (N <= sizeof(int8_t)),
int8_t,
typename boost::conditional< (N <= sizeof(int16_t)),
int16_t,
typename boost::conditional< (N <= sizeof(int32_t)),
int32_t,
int64_t
>::type
>::type
>::type type;
};
Note the the usage of BOOST_STATIC_ASSERT() and the ubiqutous ::type suffix!Now have a look at the "modern" C++11 style:
template <int N>
struct shortest_fitting_int
{
static_assert(N > 0, "negative N");
static_assert(N <= sizeof(int64_t), "N > 8");
typedef
std::conditional_t< (N <= sizeof(int8_t)),
int8_t,
std::conditional_t< (N <= sizeof(int16_t)),
int16_t,
std::conditional_t< (N <= sizeof(int32_t)),
int32_t,
int64_t
>
>
> type;
};
Did you notice how much more readable the code is? The small, innocent-looking C++11 innovation of using XXX_t templates (like void_t, enable_if_t and their ilk) removes so much of clutter! Nice one!
Source: Andrzej's C++ blog: Handling short codes — part I.