这不是一个特定的错误,而是一个一般的 C++ 设计问题。考虑以下场景:
struct MyInterface {};
struct Data : MyInterface{};
struct DataWrapper
{
SomeContainerOf<MyInterface*> getData()
{...}
private:
std::vector<Data> dataStorage;
};
根据我的要求,我需要访问器函数来DataWrapper
返回值的容器MyInterface*
(指针,因为我们真正返回Data
值)。
理想情况下,我们希望在不复制的情况下完成此操作。我想知道做到这一点的最佳方法。据我所知,如下是惯用的 C++ 方法:
auto DataWrapper::getData()
{
return dataStorage
| std::ranges::views::transform(
[](Data& d) -> MyInterface* { return &d; }
);
}
但问题是,很明显这个访问器方法对其返回值是明确的 - 我需要知道这个方法返回这个列表,并且我担心在创建返回类型时auto
,它会有点阻碍。看起来(我在这里可能是错的)你不应该知道 a 的类型view
是什么(与 lambda 类似)
我正在考虑的替代方案是制作一个自定义视图(我可以使类型更加清晰),但重新实现标准中如此明确的东西确实让我很痛苦。对于这种情况,建议采取什么行动?现代 C++ 是否说我应该保留返回值auto
?