如何根据另一个模板参数将模板参数固定为一个枚举 class?
How to fix template parameter as one enum class based on another template parameter?
我有以下代码,到目前为止,我们有衣服和鞋类。但将来可能会有更多的项目对象类型。 class Foo
是用 Object
模板化的,这里它的成员函数对于 eClothes
和 eFootwear
是相同的,但在实际代码中会进一步模板化。
有没有办法对方法 order
的实现进行去重?因为有来自
的一对一映射
- 对象::衣服 -> 电子衣服
- 对象::鞋类 -> eFootwear
.. 是否有一些技术可以用来修复基于 type
的 order
的模板参数?因此,一个 class 实例化只接受其对应类型的命令,否则就是编译时错误?
#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 << "hey\n";
}
template<eFootwear footwearkind>
void order(){
std::cout << "hey\n";
}
};
int main(){
Foo<Object::clothes> foo_clothes;
Foo<Object::footwear> foo_footwear;
foo_clothes.order<eClothes::shirt>();
foo_footwear.order<eFootwear::flipflop>();
}
定义 traits 将 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 << "hey\n";
}
};
为了简化一点 - 您可以使用宏:
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);
我有以下代码,到目前为止,我们有衣服和鞋类。但将来可能会有更多的项目对象类型。 class Foo
是用 Object
模板化的,这里它的成员函数对于 eClothes
和 eFootwear
是相同的,但在实际代码中会进一步模板化。
有没有办法对方法 order
的实现进行去重?因为有来自
- 对象::衣服 -> 电子衣服
- 对象::鞋类 -> eFootwear
.. 是否有一些技术可以用来修复基于 type
的 order
的模板参数?因此,一个 class 实例化只接受其对应类型的命令,否则就是编译时错误?
#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 << "hey\n";
}
template<eFootwear footwearkind>
void order(){
std::cout << "hey\n";
}
};
int main(){
Foo<Object::clothes> foo_clothes;
Foo<Object::footwear> foo_footwear;
foo_clothes.order<eClothes::shirt>();
foo_footwear.order<eFootwear::flipflop>();
}
定义 traits 将 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 << "hey\n";
}
};
为了简化一点 - 您可以使用宏:
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);