我目前正在开发一个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,但比较啰嗦。
我自己找到了一个方法。其实很简单。
class Base {
public:
virtual void DoSomething(void) = 0;
};
class Derived : public Base {
void DoSomething(void) {
std::cout << "Test";
}
} DerivedTest;
Base* const DerivedTestPtr = &DerivedTest;
void Test(Base* b) {
b->DoSomething();
}
int main() {
Test(DerivedTestPtr);
}