Re: emplace() overloads
Daphne Pfister ha scritto:
On Nov 20, 1:16 pm, Sylvain Pion <Sylvain.P...@sophia.inria.fr> wrote:
In the current working draft N2461, I read that associative
containers provide:
template <class... Args> pair<iterator, bool> emplace(Args&&... args);
template <class... Args> iterator emplace(const_iterator position,
Args&&... args);
What if I wish to pass a const_iterator as first argument and mean
to use the first overload?
Is this an oversight, or is this a deliberate choice?
What about using a different name for one of the 2 overloads, in order
to prevent the clash?
It seems to me that it would be unlikely that an iterator compatible
with the associative container would be able to construct a value into
the container. In the case* that foo is constructible from a constant
iterator using setname.emplace(setname.begin(),const_iter) should
work.
* I could see using a set for example as a type of tree where
value_type could be constructed with a reference to a parent node
which could be converted from a iterator..
class scope {
public:
// Using concepts in the next line would be better...
// just using this pseudo-code for an example.
template <typename parent_iter> scope(parent_iter const& x) :
parent_(*x) {}
scope() : parent_(*this) {}
...
scole const& parent_;
};
.
typedef std::unordered_set<scope> scope_set
scope_set scopes;
scope_set::const_iterator root_scope = scopes.emplace().first;
scope_set::const_iterator active_scope = root_scope;
.
if (token == "{") {
// active_scope = scopes.emplace(active_scope);
active_scope = scopes.emplace(scope_set.end(),active_scope);
...
}
That's a nice example. Please notice that there is another simple way to
rewrite
// active_scope = scopes.emplace(active_scope);
with "non-hinted" semantic in addition to:
active_scope = scopes.emplace(scope_set.end(),active_scope);
and that is:
active_scope = scopes.emplace(scope(active_scope));
if scope has a cheap move constructor and the compiler is reasonably
optimizing, I don't expect to see significant performance differences.
HTH,
Ganesh
---
[ comp.std.c++ is moderated. To submit articles, try just posting with ]
[ your news-reader. If that fails, use mailto:std-c++@ncar.ucar.edu ]
[ --- Please see the FAQ before posting. --- ]
[ FAQ: http://www.comeaucomputing.com/csc/faq.html ]