簡體   English   中英

如何將模板類限制為僅枚舉數據類型除外

[英]How to restrict a template class to except only enum data type

我編寫了一個使用枚舉數據類型的類。 現在,我想將其概括為可與任何類型的枚舉數據列表一起使用。 有沒有什么辦法寫一個只接受枚舉數據類型的模板類呢?

我的問題是如何限制模板類僅接受枚舉數據類型。

在c ++ 11中非常簡單,您可以執行std::is_enum 這是該站點的示例。

#include <iostream>
#include <type_traits>

class A {};

enum E {};

enum class Ec : int {};

int main() 
{
    std::cout << std::boolalpha;
    std::cout << std::is_enum<A>::value << '\n';
    std::cout << std::is_enum<E>::value << '\n';
    std::cout << std::is_enum<Ec>::value << '\n';
    std::cout << std::is_enum<int>::value << '\n';
}

這是使用該功能的類。

template <typename T>
struct A {
    static_assert(std::is_enum<T>::value,"not an enum");
};  

如果您沒有c ++ 11,也可以以相同的方式使用boost的is_enum ,請記住boost是開源的,因此如果您不想要全部內容,可以簽出代碼。

使用<type_traits>

#include <type_traits>

template <typename T>
struct foo
{
    static_assert(std::is_enum<T>::value, "Must be an enum type");
    ....
};

如果不想將C ++ 11限制為特定的枚舉類型,則可以通過將enum類型指定為模板參數類型來實現:

#include <iostream>

enum fred { A, B };

template <fred F>
void f(void) { std::cout << F << std::endl; }

int main()
{
    f<B>();  // works
    f<1>(); // generates an error
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM