$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
From: Arkadiy Vertleyb (vertleyb_at_[hidden])
Date: 2002-11-02 22:27:21
Rene Rivera wrote:
> How 'bout this...
>
> #include <cassert>
>
> class some_class
> {
> public:
> some_class() : number(0) { }
> int number;
> };
>
> class another_class
> {
> public:
>
> template <typename some_type>
> struct some_type_defer { typedef some_type t_; };
>
> template <typename some_type>
> typename some_type_defer<some_type>::t_ & field()
> {
> static some_type test_object;
> return test_object;
> }
> };
>
> int main(int argc, char** argv)
> {
> some_class c_;
> another_class x_;
>
> c_.number = 1;
> c_ = x_.field<some_class>();
> assert(c_.number == 0);
>
> c_.number = 2;
> x_.field<some_class>() = c_;
> assert(x_.field<some_class>().number == 2);
> }
>
> ...It works with g++ 2.96(RedHat) and 3.2.
Do I understand correctly that if you use
template <typename some_type>
some_type & field()
{
static some_type test_object;
return test_object;
}
this does not work, but if you change it to be:
template <typename some_type>
typename some_type_defer<some_type>::t_ & field()
{
static some_type test_object;
return test_object;
}
it works fine? This is scary, isn't it? :o)
> Aren't templates fun... and twisted ;-)
They sure are. Reminds me of science fiction movies, where robots start
leaving their own lives, independent of their creators :o). Template
meta-programming was DISCOVERED (!!!) Anybody knows who discovered it?
One more option would be to use:
tuple.field(column()); // create a temp object and pass by reference
Would compilers optimize away unnecessary temporary object creation?
Arkadiy