C ++:重新定义具有不同类型的模板类

时间:2017-03-18 18:55:37

标签: c++ c++11 templates enums template-specialization

我有两个(多个)枚举:

enum Choices1 : int
{
    a,
    b
};
enum Choices2 : int
{
    c,
    d
};

我希望能够将Type与每个枚举选项相关联。如果我只有一组枚举说Choices1,我可以介绍一下:

template <Choices1 c>
struct choice_traits; 

然后为每个条目专门化:

template <>
struct choice_traits<Choices1::a> 
{
    using MyType = float;
};

template <>
struct choice_traits<Choices1::b> 
{
    using MyType = double;

但是我希望能够在多个枚举中使用相同的关键字,例如:

template <>
struct choice_traits<Choices1::a>
{...};

template <>
struct choice_traits<Choices1::b>
{...};

template <>
struct choice_traits<Choices2::c>
{...};

template <>
struct choice_traits<Choices2::d>
{...};

这可能吗?如果是这样,那么非专业案例会是什么?

如果没有,是否有其他方法可以将类型与(Choice1::a,Choice1::b,Choice2::c,Choice2::d)以及更多此类枚举相关联?

2 个答案:

答案 0 :(得分:1)

不是一个很好的解决方案,但是......您可以使用intChoiches1的公共基础(Choiches2)并将非专业案例定义为

template <int>
struct choice_traits;

此时问题是Choiches1::a == Coiches2::cChoiches1::b == Choiches2::d所以,如果你想要定义像

这样的东西
template <>
struct choice_traits<Choices1::a> 
 { using MyType = float; };

template <>
struct choice_traits<Choices1::b> 
 { using MyType = double; };

template <>
struct choice_traits<Choices2::c> 
 { using MyType = int; };

template <>
struct choice_traits<Choices2::d> 
 { using MyType = long; };

yuo必须避免Choiches1Choiches2值之间的冲突。

如果您知道Choiches1值的数量,则可以使用更大的数字启动Choiches2;例如,如果您确定有少于100个Choiches1值,则可以按如下方式定义枚举

enum Choices1 : int
{ a = 0, b };

enum Choices2 : int
{ c = 100, d };

另一个解决方案可以使用两个枚举的偶数和奇数值;

之类的东西
enum Choices1 : int
{ a = 0, b = a+2 }; // add 2 for every next value

enum Choices2 : int
{ c = 1, d = c+2 }; // add 2 for every next value

以下是一个完整的例子

enum Choices1 : int
{ a = 0, b };

enum Choices2 : int
{ c = 100, d };

template <int>
struct choice_traits;

template <>
struct choice_traits<Choices1::a> 
 { using MyType = float; };

template <>
struct choice_traits<Choices1::b> 
 { using MyType = double; };

template <>
struct choice_traits<Choices2::c> 
 { using MyType = int; };

template <>
struct choice_traits<Choices2::d> 
 { using MyType = long; };

int main()
 {
   choice_traits<a>::MyType fl { 1.1f };
   choice_traits<b>::MyType db { 2.2 };
   choice_traits<c>::MyType in { 3 };
   choice_traits<d>::MyType ln { 4L };
 } 

答案 1 :(得分:0)

这是一个过度的解决方案:

template <class Enum, Enum e>
struct choice_traits;

template<>
struct choice_traits<Choices1, Choices1::b>
{
      typedef float MyType;
};

//using
typename choice_traits<Choices1, Choices1::b>::MyType m {0.0};