Boost logo

Boost Users :

Subject: [Boost-users] Iterate over template arguments
From: Allan Nielsen (a_at_[hidden])
Date: 2011-11-23 09:34:03


Hi,

I have a set of old classes which I use for inter process communication:

Example:
    template<typename T0, typename T1> class Interface2: public InterfaceBase {
        public:
            Interface2( const std::string & name,
                        IPCManager * ipcmanager) :
                InterfaceBase(name, ipcmanager){ }

            Interface2( const std::string & name,
                        boost::function<void ( const T0 & t0, const T1
& t1 ) > _f,
                        IPCManager * ipcmanager) :
                InterfaceBase(name, ipcmanager),
                f(_f) { }

            virtual ~Interface2() { }

            boost::function<void ( const T0 & t0, const T1 & t1 ) > f;

        protected:
            void handler(IpcMsg & m) {
                if(! f.empty()){

                    if( m.value_size() != 2 ) {

m.set_type(IpcMsg_Type_RESPONSE_FAILED_WRONG_VALUE_NUMBERS);
                        return;
                    }

                    GMB_ARGUMENT_DESERILIZE(T0, 0);
                    GMB_ARGUMENT_DESERILIZE(T1, 1);

                    try {
                        f(t0, t1);
                        m.set_type(IpcMsg_Type_RESPONSE_OK);
                    } catch (std::exception e) {
                        m.set_type(IpcMsg_Type_RESPONSE_FAILED_EXCEPTION);
                    }

                }else{

m.set_type(IpcMsg_Type_RESPONSE_FAILED_NO_FUNCTION_ATTACHED);
                }
            }

            IPCManager * ipc;
    };

It works fine, but it might not be the most elegant solution, and I
would very much like to improve it. Today I have Interface0-10 which
accept from 0 to 10 arguments, and InterfaceCaller0-10 which call an
interface with 0-10 arguments. And another set of classes with an
return value as well.

What I would like is an interface where the following would be valid
(much like boost function):

Interface< int (int, std::string ) > if1(...) ;

I known this might not be easy or the intension of c++99, but I would
like to give it a try anyway...

So, I would appreciate it if somebody could give me some pointers on
how I can process each of the templates arguments.

I do not have access to a c++0x compiler on the target where this is used.

Best regards
Allan W. Nielsen


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