如何将模板参数固定为一个基于另一个模板参数的枚举类



我有下面的代码,到目前为止,我们有衣服和鞋子。但是将来可能会有更多的项对象类型。类Foo是用Object模板化的,它的成员函数在这里对eClotheseFootwear都是相同的,但在实际代码中会进一步模板化。

有没有一种方法可以消除方法order的重复?因为有一对一的映射

  • 对象::衣服->eClothes
  • 对象::鞋类->电子鞋类

。。在type的基础上,有没有一些技术可以用来固定order的模板参数?因此,一个类实例化只接受其相应类型的订单,否则就是编译时错误?

#include<iostream>
enum class Object{
clothes,
footwear,
};
enum class eClothes{
shirt,
};
enum class eFootwear{
flipflop,
};
template <Object type>
class Foo{
public:
template<eClothes clothkind>
void order(){
std::cout << "heyn";
}
template<eFootwear footwearkind>
void order(){
std::cout << "heyn";
}
};
int main(){
Foo<Object::clothes> foo_clothes;
Foo<Object::footwear> foo_footwear;
foo_clothes.order<eClothes::shirt>();
foo_footwear.order<eFootwear::flipflop>();
}

定义将Object映射到其值类型的特征。类似:

template <Object value> struct ObjectTraits;
template <> struct ObjectTraits<Object::clothes>
{
using type = eClothes;
};
template <> struct ObjectTraits<Object::footwear>
{
using type = eFootwear;
};
template <Object type>
class Foo{
public:
using Kind = typename ObjectTraits<type>::type;
template<Kind kind>
void order(){
std::cout << "heyn";
}
};

为了简化一点,您可以使用宏:

template <Object value> struct ObjectTraits;
#define OBJECT_TRAITS(value, kind) 
template <> struct ObjectTraits<Object::value> { 
using type = kind; 
}
OBJECT_TRAITS(clothes , eClothes);
OBJECT_TRAITS(footwear, eFootwear);

相关内容

  • 没有找到相关文章

最新更新