gpt4 book ai didi

c++ - 在容器 : hardcode the container type, 上运行的方法还是使用通用模板迭代器?

转载 作者:行者123 更新时间:2023-11-30 02:41:26 26 4
gpt4 key购买 nike

我有代码,从概念上讲,我的输入是一些 Foo 对象的容器。代码一个一个地“处理”这些对象,期望的结果是填满 FooProduct 结果对象的容器。

我只需要一次通过输入容器。 “处理”是有状态的(这不是 std::transform())并且结果对象的数量独立于输入对象的数量。

顺便说一句,我可以在这里看到两种明显的定义 API 的方法。

最简单的方法是硬编码特定类型的容器。例如,我可以决定我期待 vector 参数,例如:

void ProcessContainerOfFoos(const std::vector<Foo>& in, std::vector<FooProduct>&out);

但是,我真的没有任何理由将客户端代码限制在特定类型的容器中。我可以使方法通用并使用迭代器作为模板参数,而不是将参数类型专门限制为 vector:

/**
* @tparam Foo_InputIterator_T An input iterator giving objects of type Foo.
* @tparam FooProduct_OutputIterator_T An output iterator writing objects
* of type FooProduct.
*/
template<typename Foo_InputIterator_T, typename FooProduct_OutputIterator_T >
void ProcessContainerOfFoos(Foo_InputIterator_T first, Foo_InputIterator_T last,
FooProduct_OutputIterator_T out);

我在这两种表述之间争论不休。

注意事项

对我来说,第一个代码在我看来“更简单”,第二个似乎“更正确”:

  • 非模板类型使签名更清晰;我不需要在文档中解释使用什么类型以及对模板参数的约束是什么。
  • 如果没有模板,我可以将实现隐藏在 .cpp 文件中;对于模板,我需要在头文件中公开实现,强制客户端代码包含实际处理逻辑所需的任何内容。
  • 模板化版本感觉更清楚地表达了我的意图,因为我宁愿对使用的容器类型无动于衷。
  • 模板化版本更加灵活和可测试 - 例如,在我的代码中我可能使用了一些自定义数据结构 MySuperEfficientVector ,但我仍然能够测试 MyFooProcessor 不依赖于自定义类。

考虑到这些因素,除了主观选择之外,是否有选择其中一个而不是另一个的主要原因?同样,是否有更好的方法来构建我所缺少的 API ?

最佳答案

除了您已经列出的注意事项:

  • 模板版本允许客户端代码传递任何迭代器范围,例如子范围或反向迭代器,而不仅仅是从头到尾的整个容器。
  • 模板版本允许传递 Foo 以外的值类型.为了使它有用,处理当然必须是通用的。
  • 如果模板仅适用于特定的值类型,而用户试图使用迭代器来处理错误的类型,则错误消息可能不会很好地描述他们的错误。如果这是一个问题,您可以使用类型特征给用户一个更好的错误:static_assert(std::is_same<Iter::value_type, Foo>::value, "I want my Foo");在将概念提案添加到标准之前,没有好的方法可以将签名中模板类型的要求传达给用户。

也可以选择同时提供这两种功能。硬编码的可以委托(delegate)给模板化版本。这为您提供了两个版本的优势,但代价是使您的 API 膨胀。

关于c++ - 在容器 : hardcode the container type, 上运行的方法还是使用通用模板迭代器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28092509/

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