$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
From: Bronek Kozicki (Brok_at_[hidden])
Date: 2003-10-20 07:05:31
Pavol Droba <droba_at_[hidden]> wrote:
>> How about trim ( in_place( orig ) )?
> As I have already mentioned, inplace variant differ in the
> implementation from the copy variants. Such a convetion would be hard
> to achieve.
Not so, if in_place returns proxy object.
template <typename T> class inplace_proxy;
template <typename T> inplace_proxy<T&> in_place(T&);
template<> class inplace_proxy<std::string&>
{
public:
inplace_proxy<std::string&> (std::string& str) : ref_(str) {}
inplace_proxy<std::string&> (const inplace_proxy<std::string&> & src)
: ref_(src.ref_) {}
std::string& ref() {return ref_;}
//...
private:
std::string& ref_;
inplace_proxy<std::string&>& operator=(const
inplace_proxy<std::string&>&);
};
template<>
inplace_proxy<std::string&> in_place<std::string>(std::string& str)
{
return inplace_proxy<std::string&>(str);
}
(template "inplace_proxy<std::string&>" is just an idea, there might be
something else instead)
> IMHO copy and inplace variants should be very explicitly
> distinguished.
We might have two overloaded versions of mutating algorithms:
inplace_proxy<std::string&> trim(inplace_proxy<std::string&>);
std::string trim(const std::string &);
which will make both variants very easy to distinguish. Additional bonus
is that you can nest calls to both variants in very natural manner:
ucase(trim(in_place(str1))); // in place
std::string str3 = ucase(trim(str2)); // using temporary copies
There is a problem, though: proxy class (or template, as proposed above)
will add small overhead, which is problem for "in-place algorithms" as
these might be expected to be significaly faster than "copying
algorithms", thus carrying as small overhead as possible.
B.