条件枚举作为模板类的一部分

时间:2015-07-12 11:22:31

标签: templates c++11 static enable-if enum-class

我正在开发用于微控制器的c ++库,我需要一种基于模板类型指定不同枚举类内容的方法。

到目前为止我有这个代码:

#include <cstdint>
#include <type_traits>

enum class timer_e {
    timer1,
    timer2
};

template<typename>
struct is_basic_timer : std::false_type {};

template<>
struct is_basic_timer<timer_e::timer1> : std::true_type {};

template<typename>
struct is_advanced_timer : std::false_type {};

template<>
struct is_advanced_timer<timer_e::timer2> : std::true_type {};

template<timer_e T>
class Timer {
public:

    // Prototype for options enum.
    enum class options;

    typename std::enable_if<is_basic_timer<T>::value, decltype(options)>::type options : std::uint32_t {
        basic_option_1,
        basic_option_2
    };

    typename std::enable_if<is_advanced_timer<T>::value, decltype(options)>::type options : std::uint32_t {
        basic_option1,
        basic_option2,
        advanced_option1,
        advanced_option2
    };

    static void enableOption(options o) {
        SFR |= static_cast<std::uint32_t> (o);
    }

    static void disableOptions(options o) {
        SFR &= ~static_cast<std::uint32_t> (o);
    }

private:
    Timer() = delete;
};

Timer类应该只是静态使用。我希望根据模板类型修改选项枚举内容,以避免在特殊功能寄存器(SFR)中设置不支持的选项。上面的代码是我最好的尝试,但编译器不喜欢我使用decltype。

有没有办法通过上面定义的类型特征基于模板类型声明不同的枚举类内容?

0 个答案:

没有答案