所以我有这个非常丑陋的代码:

template <typename T>
std::conditional_t<sizeof(T) == sizeof(char),
                   char,
                   conditional_t<sizeof(T) == sizeof(short),
                                 short,
                                 conditional_t<sizeof(T) == sizeof(long),
                                               long,
                                               enable_if_t<sizeof(T) == sizeof(long long),
                                                           long long>>>> foo(T bar){return reinterpret_cast<decltype(foo(bar))>(bar);}

我正在使用嵌套的conditional_t进行某种大小写的陈述。是否有一些东西可以更优雅地完成此任务,或者我需要自己编写模板化案例陈述?

注意:我实际上知道reinterpret_cast的这种用法是不好的:Why Doesn't reinterpret_cast Force copy_n for Casts between Same-Sized Types?

最佳答案

我不得不做过一次这样的事情,所以我写了一个small wrapper来整齐地达到结果。您可以按以下方式使用它(请参见here进行测试)

template<class T>
typename static_switch<sizeof(T)
            ,int // default case
            ,static_case<sizeof(char),char>
            ,static_case<sizeof(short),short>
            ,static_case<sizeof(long),long>
            >::type foo(T bar){ ... }

在幕后,它几乎可以完成您已经拥有的一切,但是通过包装它,我们可以使它(更)可读。如果需要,还有一个版本可以让您在T类型上切换透明度。

编辑:在@Deduplicator的建议下,这里是其背后的代码
#include <type_traits>

/*
 * Select a type based on the value of a compile-time constant such as a
 * constexpr or #define using static_switch.
 */

template<int I,class T>
struct static_case {
    static constexpr int value = I;
    using type = T;
};

template<int I, class DefaultType, class Case1, class... OtherCases>
struct static_switch{
    using type = typename std::conditional< I==Case1::value ,
                    typename Case1::type,
                    typename static_switch<I,DefaultType,OtherCases...>::type
                     >::type;
};

struct fail_on_default {};

template<int I, class DefaultType, class LastCase>
struct static_switch<I,DefaultType,LastCase> {
    using type = typename std::conditional< I==LastCase::value ,
                    typename LastCase::type,
                    DefaultType
                     >::type;

    static_assert(!(std::is_same<type, fail_on_default>::value),
                  "Default case reached in static_switch!");
};

07-26 05:55