5

我正在用标准 C++ 编写一个库来进行语音转换。到目前为止,我已经使用了 std::string 。但是将来我可能不得不将其更改为其他内容(std::wstring 或其他内容)。所以我需要以一种可以轻松切换的方式编写我的库。到目前为止,我已经完成了以下工作来实现这一目标。

  1. 创建了一个所有 CPP 文件都将使用的头文件
  2. 为此添加了“typedef std::string”,并在文件中的任何地方使用了新名称。

如果我需要更改类型,我可以简单地在头文件中更改,它会在任何地方反映出来。如果有人能看到这是正确的方法或者有更好的方法来做到这一点,我将不胜感激?

谢谢

4

5 回答 5

5

您可以编写适用于任何一种字符串类型的模板函数,或者任何具有适当方法的东西。

如果您按照建议执行 typedef,则将来更改 typedef 时将需要更改所有代码。我建议反对它。

编辑:关键是 string 和 wstring 不可互换。当然,您可以通过更改一行来更新您的库,但这仅仅是开始 - 更改 typedef 意味着您正在更改库的公共 API。您必须更改和测试与您的库交互的所有代码,这可能代表了所涉及的大部分工作。甚至有可能一个简单的搜索和替换就足以更新你的库,然后 typedef 什么也没给你买。

坚持每个人都知道和理解的标准类型是有价值的。

于 2009-01-01T03:30:45.537 回答
2

我认为 typedefing std::string 是合理的。你仍然绑定到一个接口。如果您曾经切换到具有不兼容接口的字符串实现,您可以将 typedef 的值更改为某个适配器类。在 C++ 中,您可以用最少甚至没有开销来做到这一点。更改为新的字符串类型意味着更改适配器类。如果您发现自己经常更换适配器,您可以将其设置为模板。

但是,您仍然无法避免其他人(或以后的您自己)忘记 typedef 并直接使用 std::string 。

于 2009-01-01T03:43:51.080 回答
1

如果您预计字符串将来需要更改,最好将其从其余代码中抽象出来。

Typedef 或专用类都是实现此目的的两种方法。

使用 typedef 是一个好的开始:代码依赖于抽象。问题是:您的客户端代码可以使用任何优惠std::string,因此如果您想稍后迁移,您将不得不事后分析需要哪些方面(如果您不想模仿整体std::string)。

如果您想控制客户端代码可以使用的内容,最好使用具有更有限接口的适当类。

所以:了解您的需求并做出决定。

于 2009-01-01T14:53:36.123 回答
0

我将创建一个具有 std::string 作为私有成员的类。然后您需要重新实现您想要使用的方法,但是如果您将来切换字符串类型,您需要做的就是重写这个类。

typedef 可以很好地从 string 切换到 wstring,但是切换到具有不同接口的 string 类并不是很容易(即 qstring)。

于 2009-01-01T03:26:31.037 回答
0

只要您将来用 std::string 替换的任何东西都具有与 std::string 相同的方法、构造函数等,这将起作用。例如,这不适用于 std::wstring,因为它的方法对宽字符而不是 char 进行操作。

如果您真的打算在将来更换类型,最好将您的数据封装在具有所需接口的自定义类中,然后在保持接口不变的情况下更改实现。std::string 对于您的应用程序来说可能过于“原始”。

于 2009-01-01T03:28:13.107 回答