Re: case/switch metaprogramming
Aaron Graham wrote:
I have a switch/case statement that looks something like this:
std::auto_ptr<Dev> dev;
switch (dev_id) {
case 1: dev = std::auto_ptr<Dev>(new devices::Device<1>()); break;
case 2: dev = std::auto_ptr<Dev>(new devices::Device<2>()); break;
case 3: dev = std::auto_ptr<Dev>(new devices::Device<3>()); break;
case 4: dev = std::auto_ptr<Dev>(new devices::Device<4>()); break;
case 5: dev = std::auto_ptr<Dev>(new devices::Device<5>()); break;
....
case 47: dev = std::auto_ptr<Dev>(new devices::Device<47>()); break;
default: dev = std::auto_ptr<Dev>(new devices::Device<0>()); break;
}
template <class N>
class DeviceAt
{
static std::auto_ptr<Dev> get( unsigned idx )
{
switch( idx )
{
case N+0: return std::auto_ptr<Dev>( new devices::Device<N
+0>() );
case N+1: return std::auto_ptr<Dev>( new devices::Device<N
+1>() );
case N+2: return std::auto_ptr<Dev>( new devices::Device<N
+2>() );
default: return DeviceAt<N+3>::get( idx );
}
}
}
With a little trouble you can delay the creation of std::auto_ptr and
check the index like so:
//Complete code....
#include <memory>
#include <stdexcept>
namespace devices{
struct Dev{ virtual ~Dev(){} };
template <int N>
struct Device : Dev
{
};
}
//-----------------Important part---------------------
template <int N, int NMax>
class DeviceAt
{
struct no_such_device : std::exception
{
virtual const char* what() const throw()
{
return "no such device";
}
};
template <int M>
static std::auto_ptr<devices::Dev> doGet()
{
using namespace devices;
if( M > NMax ){ throw no_such_device(); }
else
{
return std::auto_ptr<Dev>(
new Device<M>() );
}
}
static std::auto_ptr<devices::Dev>
get( unsigned idx )
{
switch( idx )
{
case N+0: return doGet<N+0>();
case N+1: return doGet<N+1>();
case N+2: return doGet<N+2>();
case N+3: return doGet<N+0>();
case N+4: return doGet<N+1>();
default:
return typename::DeviceAt<N+5,NMax>::get( idx );
}
}
};
Regards,
Werner
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]