C ++中的多态映射键

时间:2018-05-01 09:18:27

标签: c++ design-patterns

我正在研究计算机视觉API,我有各种算法,这些算法都处理图像数据并尝试对某些对象进行分类。

有些算法很简单,只是简单地根据对象的大小对对象进行分类即。算法可能会根据它们的大小返回所有对象的计数,例如小,中,大,例如

其他一些算法更精细,可以根据对象的真实类型对对象进行分类,例如桌子,椅子,床。

所以我有一个所有这些计数对象的接口:

class IFurnitureCounter
{
    virtual std::map<ObjectType, size_t> getCount(const Image &input) = 0;
};

这个想法是这些算法中的每一个都将实现这个getCount()方法,以便调用者可以非常地使用它们。

我的问题是ObjectType密钥变成了混搭。因此,我可以将此ObjectType定义为枚举,例如:

enum class ObjectType {SMALL, MEDIUM, BIG, TABLE, CHAIR, BED} 

然而,这感觉很糟糕,因为每个算法现在都可以看到所有类型,即使特定算法可能只对它们的子集起作用。我想知道是否有更好的设计范式可以在算法之间更好地解耦这些类型。

修改 我想到的一件事是针对不同的算法使用不同的枚举,并专注于该类型。

所以,说我们有类似的东西:

enum class SizeEnum {SMALL, MEDIUM, BIG};
enum class ObjectTypeEnum {CHAIR, TABLE, BENCH}

所以,我的界面看起来像:

template<typename EnumType>
class IFurnitureCounter
{
    virtual std::map<EnumType, size_t> getCount(const Image &input) = 0;
};

现在我可以拥有类似的东西:

class MyAwesomeCounter: public IFurnitureCounter<ObjectTypeEnum>
{
   // My implementation here...
};

这样的事情会起作用吗?也许我的语法不准确,但有人能告诉我这是否合理?

1 个答案:

答案 0 :(得分:0)

我不确定这是否是一种有效的方法,但我发现基于模板的方法似乎有效(至少从C ++ 11开始)。

// Interface class
template<typename EnumType>
class IFurnitureCounter
{
public:
    virtual std::map<EnumType, size_t> getCount() = 0;
};

现在我们可以从基地继承:

enum class ObjectTypeEnum {CHAIR, TABLE, BENCH};
class MyAwesomeCounter: public IFurnitureCounter<ObjectTypeEnum>
{
public:
    virtual std::map<ObjectTypeEnum, size_t> getCount()
    {
         ObjectTypeEnum ote = ObjectTypeEnum::CHAIR;
         std::map<ObjectTypeEnum, size_t> map;
         map[ote] = 5;
         return map;
    }
};

int main()
{
    MyAwesomeCounter mac = MyAwesomeCounter();
    auto r = mac.getCount();
    std::cout << r[ObjectTypeEnum::CHAIR] << std::endl;
}
似乎做了这个工作。我相信这种做法有些失败,我期待着有任何意见。

此代码可在此处运行:http://www.cpp.sh/8h5uy