Boost logo

Boost Users :

From: Sliwa, Przemyslaw (London) (Przemyslaw_Sliwa_at_[hidden])
Date: 2005-05-12 05:32:27


Thanks for help,

I have an additional question. Does anyone know why the following
program gives different output on VC++ 6 and VC++ 2003 NET? It is pretty
strange, isn't it?

Thanks in advance.

Pshemek

#include <iostream>
#include <cmath>

using namespace std;

class A
{
        protected:
                char m_d;
};

class B : public A
{
        public:
                typedef char s;
        private:
                unsigned short g;
};

class C : public A
{
        public:
                typedef short unsigned s;
        private:
                unsigned d;
};

template<bool cond>
class Select {};

template<> class Select<true>
{
        static void Statment1(double g)
        {
                cout << g*g << endl;
        }
        public:
                static void f(double g)
                {
                        Statment1(g);
                }
};

template<> class Select<false>
{
        static void Statment2(double g)
        {
                cout << sqrt(g) << endl;
        }
        public:
                static void f(double g)
                {
                        Statment2(g);
                }
};

template<bool cond> void exec()
{
        Select<cond>::f(3.0);
}

template<class T>
void foo()
{
        exec<sizeof(T::s)==sizeof(B::s)>();
        exec<sizeof(T::s)==sizeof(C::s)>();
}

int main()
{
        foo<B>();
        foo<C>();

        return 0;
}

-----Original Message-----
From: boost-users-bounces_at_[hidden]
[mailto:boost-users-bounces_at_[hidden]] On Behalf Of Eric Niebler
Sent: 11 May 2005 18:37
To: boost-users_at_[hidden]
Subject: [Boost-users] Re: Question

Sliwa, Przemyslaw (London) wrote:
>
> I would like to write a template which depending on the argument type
> does different things.
>
> For example the pseudo code:
>
> template <class T, class C>
> foo(T& nT, C& nC)
> {
> // common code;
> if(T==C)
> // specific code;
> .....
>
> // again common code;
> }
>
> Can the template meta programming help me in this case?

It may. It depends on whether "specific code" compiles when T!=C. If it
does, you could do this:

template <class T, class C>
void foo(T& nT, C& nC)
{
     // common code
     if(boost::is_same<T,C>::value)
       { /* specific code */ }
     // again common code
}

where is is_same<> is defined in boost/type_traits/is_same.hpp. If
"specific code" doesn't compile when T!=C, you need to get fancier. An
overloaded helper function is the way to go:

template<class T, class C>
void specific_code(T&, C&) {}

template<class T>
void specific_code(T&, T&)
{
   // specific code here
}

template <class T, class C>
void foo(T& nT, C& nC)
{
     // common code
     specific_code(nT, nC);
     // again common code
}

HTH,

-- 
Eric Niebler
Boost Consulting
www.boost-consulting.com
_______________________________________________
Boost-users mailing list
Boost-users_at_[hidden]
http://lists.boost.org/mailman/listinfo.cgi/boost-users
--------------------------------------------------------
If you are not an intended recipient of this e-mail, please notify the sender, delete it and do not read, act upon, print, disclose, copy, retain or redistribute it. Click here for important additional terms relating to this e-mail.     http://www.ml.com/email_terms/
--------------------------------------------------------

Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net