我有下面的代码,到目前为止,我们有衣服和鞋子。但是将来可能会有更多的项对象类型。类Foo
是用Object
模板化的,它的成员函数在这里对eClothes
和eFootwear
都是相同的,但在实际代码中会进一步模板化。
有没有一种方法可以消除方法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);