gpt4 book ai didi

c++ - Pimpl成语: What size_type to use if implementation is unknown?

转载 作者:行者123 更新时间:2023-11-30 04:39:34 24 4
gpt4 key购买 nike

我有一个包含元素数组的类,我想给它一个 GetSize成员函数。但是我应该给那个函数什么返回类型呢?

我使用的是 pimpl 习惯用法,因此在头文件中不知道实现将使用什么来存储元素。所以我不能只说 std::vector<T>::size_type ,例如:

class FooImpl;

class Foo {
FooImpl* impl_;
public:
TYPE GetSize(); // what TYPE??
};

最佳答案

如果客户端代码只能看到Foo(这是pimpl惯用语的目的),那么在具体实现中定义一个特定的size_type是没有用的——它无论如何,客户都不会看到/无法访问。标准容器可以做到这一点,因为它们是建立在所谓的“编译时多态性”之上的,而您专门尝试使用[可能]运行时实现隐藏方法。

在您的情况下,唯一的选择是选择一个“应该足以满足所有可能的实现”的整数类型(例如 unsigned long)并坚持使用。

另一种可能性是使用 uintptr_t 类型,如果它在您的实现中可用(它在 C99 中标准化,但在 C++ 中不是)。这个整数类型应该覆盖程序可用的整个存储地址范围,这意味着它总是足以表示任何内存容器的大小。请注意,其他张贴者经常使用相同的逻辑,但错误地得出结论,即此处使用的适当类型是 size_t。 (这通常是缺乏非平面内存模型实现经验的结果。)如果您的容器始终基于物理数组,size_t 将起作用。但是,如果您的容器并不总是基于数组,size_t 甚至不是此处使用的正确类型,因为它的范围通常小于非连续(非数组)的最大大小-based)容器。

但无论如何,无论您最终使用的是什么大小,将它隐藏在 typedef 名称后面是个好主意,就像在标准容器中所做的那样。

关于c++ - Pimpl成语: What size_type to use if implementation is unknown?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2178252/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com