如何根据另一个模板参数将模板参数固定为一个枚举 class?

How to fix template parameter as one enum class based on another template parameter?

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

有没有办法对方法 order 的实现进行去重?因为有来自

的一对一映射

.. 是否有一些技术可以用来修复基于 typeorder 的模板参数?因此,一个 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>();
}

定义 traitsObject 映射到它的值类型。喜欢:

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);