我正在用标准C ++编写一个库来进行语音转换。我现在使用std :: string。但是将来我可能不得不将其更改为其他(std :: wstring或其他)。所以我需要以这样的方式编写我的库,以便我可以轻松地切换它。到目前为止,我已经完成了以下工作。
如果我需要更改类型,我可以简单地更改头文件,它将在任何地方反映出来。如果有人能看到这是正确的做法,或者有更好的方法可以做到这一点,我会很感激吗?
由于
答案 0 :(得分:5)
您可以编写适用于任何类型字符串的模板函数,或者任何具有正确方法的函数。
如果按照建议进行typedef,则需要在更改typedef时更改所有代码。我建议不要这样做。
编辑:重点是字符串和wstring不可互换。当然,您将能够通过更改单行更新您的库,但这只是一个开始 - 更改typedef意味着您正在更改库的公共API。您必须更改并测试与库交互的所有代码,这可能代表了所涉及的大部分工作。甚至可以通过简单的搜索和替换来更新您的库,然后typedef就没有给您买任何东西。
坚持每个人都知道和理解的标准类型是有价值的。
答案 1 :(得分:2)
我认为typedeffing std :: string是合理的。你仍然绑定了一个接口。如果您切换到具有不兼容接口的字符串实现,则可以将typedef的值更改为某个适配器类。在C ++中,您可以通过最小的开销或无开销来实现此目的。更改为新的字符串类型然后意味着更改适配器类。如果您发现自己经常更换适配器,可以将其设置为模板。
你仍然没有免于其他人(或者你自己以后)忘记了typedef并直接使用std :: string。
答案 2 :(得分:1)
如果您希望将来需要更改字符串,最好将其从其余代码中抽象出来。
Typedef或专用类都是实现此目的的方法。
使用typedef是一个好的开始:代码依赖于抽象。问题是:您的客户端代码可以使用任何 std::string
个优惠,因此如果您想稍后迁移,则必须分析事后需要哪些方面(如果您不知道)我想模仿整个std::string
)。
如果您想要控制客户端代码可以使用的内容,您最好使用具有更有限接口的正确类。
所以:了解你的需求并做出决定。
答案 3 :(得分:0)
我会创建一个具有std :: string作为私有成员的类。然后,您需要重新实现要使用的方法,但如果将来切换字符串类型,则需要重写此类。
typedef可以很好地从字符串切换到wstring,但切换到具有不同接口的字符串类并不是很容易(即.qstring)。
答案 4 :(得分:0)
只要你将std :: string替换为具有所有相同的方法,构造函数等作为std :: string,这将是有效的。例如,这不适用于std :: wstring,因为它的方法操作宽字符而不是char。
如果您真的打算将来更换类型,那么将数据封装在一个自定义类中并开始使用所需的接口然后更改实现,同时保留接口可能是个好主意。相同。对于你的应用程序,std :: string可能太“原始”了。