Eric Niebler: out parameters, move semantics, and stateful algorithms
This post from Eric, inspired by a prompt from Andrei Alexcandrescu, examines the interface of std::getline appraising its usability and performance. Eric looks at a few different designs, in particular those that leverage the move semantics introduced in C++11.
This is a particularly good exploration of a small and simple API – almost too simple to bother with – and Eric’s range-based solution is far more natural and still efficient. The crux of his design approach stems from the insightful realisation that “getline
is a curious example because what looks at first blush like a pure out parameter is, in fact, an in/out parameter; on the way in, getline
uses the passed-in buffer’s capacity to make it more efficient. This puts getline
into a large class of algorithms that work better when they have a chance to cache or precompute something.“
The discussion in the comments below the post also merits reading, particularly Bartosz Milewski’s suggestion that front
be thought of as take 1
(take n xs i
s a function in Haskell that returns a list of the first
n
elements of the list xs
.