如何将一个抽象类的派生类作为参数传递?

我目前正在开发一个C++头文件,用于编码和解码文本。准确的说是:UTF-8、UTF-16、UCS-2和UTF-32。UTF -8, UTF -16, UCS -2 和 UTF -32. 但是我的C++知识已经到了不能再进一步的地步。

我想用一个抽象类来进行解码和编码 同时为每个编解码器创建基类。然后,如果使用任何与编码或解码相关的函数,开发人员应该可以只传递一个自定义的数据类型给函数。

问题是,我不知道如何真正做到这一点。毕竟,你不能传递一个静态类作为参数。但我也不想硬编码什么,开发者应该也能不费吹灰之力地添加任何编解码器,而且不需要修改我的头。

另外,它应该尽可能的简单。代码应该是这样的。

namespace Encoding {

  class Encoder {
  public:
    virtual std::string Encode(std::string sOriginal) = 0;
  };

  // Derived classes like UTF8 and UCS2 here

}

void OutputEncoded(std::string s, Encoder enc) {
  std::cout << enc.Encode(s);
}


int main() {
  OutputEncoded("Hellö Wörld!", Encoding::UTF8);
}

你知道怎么做吗?也许可以不创建对象,只使用静态方法?或者我必须使用一个带有指针的对象?

解决方案:

抽象类的可能替代品是模板。

namespace Encoding {

  class UTF8 {
  public:
    static std::string Encode(std::string sOriginal);
  };
  class UCS2 {
  public:
    static std::string Encode(std::string sOriginal);
  };

}

template <typename Encoder>
void OutputEncoded(const std::string& s) {
  std::cout << Encoder::Encode(s);
}

int main()
{
  OutputEncoded<Encoding::UTF8>("Hellö Wörld!");
}

UTF8和UCS2类应该尊重相同的接口,而不需要抽象类和虚拟方法来执行。

C++20的概念可能有助于强制执行正确的用法。之前可能用SFINAE,但比较啰嗦。

给TA打赏
共{{data.count}}人
人已打赏
未分类

使用matplotlib.pylot.imshow()从对象的类(如1-SHIRTS, 2-SHOES等)中获取相应图像的代码。

2022-9-8 5:52:44

未分类

Matplotlib, matshow不与网格规格对齐,当fig大小为bi时。

2022-9-8 5:52:46

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索