Say I am making a class client
. I would like client
to be able to be constructed with the following types:
client(const boost::network::uri::uri &, const boost::network::uri::uri &)
client(const std::string &, const std::string &)
client(const char *, const char *)
But... I would also like all the permutations...
client(const boost::network::uri::uri &, const boost::network::uri::uri &)
client(const std::string &, const std::string &)
client(const char * &, const char * &)
client(const boost::network::uri::uri &, const std::string &)
client(const std::string &, const boost::network::uri::uri &)
client(const boost::network::uri::uri &, const char * &)
client(const char * &, const boost::network::uri::uri &)
client(const std::string &, const char * &)
client(const char * &, const std::string &)
It may be assumed that my client class, stripped down for simplicity, looks like the following.
#include <string>
#include <boost/network.hpp>
#define HOST_URI "..."
#define AUTH_URI HOST_URI"..."
namespace bn = boost::network;
class client
{
private:
const bn::uri::uri host_;
const bn::uri::uri auth_;
public:
client(const bn::uri::uri & host = const bn::uri::uri(HOST_URI),
const bn::uri::uri & auth = const bn::uri::uri(AUTH_URI));
client(const std::string & host = const std::string(HOST_URI),
const std::string & auth = const std::string(AUTH_URI));
client(const char * & host = HOST_URI,
const char * & auth = AUTH_URI);
client(const bn::uri::uri & host = const bn::uri::uri(HOST_URI),
const std::string & auth = const std::string(AUTH_URI));
client(const std::string & host = const std::string(HOST_URI),
const bn::uri::uri & auth = const bn::uri::uri(AUTH_URI));
client(const bn::uri::uri & host = const bn::uri::uri(HOST_URI),
const char * & auth = AUTH_URI);
client(const char * & host = HOST_URI,
const bn::uri::uri & auth = const bn::uri::uri(AUTH_URI));
client(const std::string && host = const std::string(HOST_URI),
const char * & auth = AUTH_URI);
client(const char * & host = HOST_URI,
const std::string && auth = const std::string(AUTH_URI));
};
and currently defined as:
#include <string>
#include <boost/network.hpp>
namespace bn = boost::network;
client::client(const bn::uri::uri & host,
const bn::uri::uri & auth)
: host_(host), auth_(auth)
{
...
};
client::client(const std::string & host,
const std::string & auth)
: client(bn::uri::uri(host), bn::uri::uri(auth)){}
client::client(const char * & host,
const char * & auth)
: client(bn::uri::uri(host), bn::uri::uri(auth)){}
client::client(const bn::uri::uri & host,
const std::string & auth)
: client(host, bn::uri::uri(auth)){}
client::client(const std::string & host,
const bn::uri::uri & auth)
: client(bn::uri::uri(host), auth){}
client::client(const bn::uri::uri & host,
const char * & auth)
: client(host, bn::uri::uri(auth)){}
client::client(const char * & host,
const bn::uri::uri & auth)
: client(bn::uri::uri(host), auth){}
client::client(const std::string & host,
const char * & auth)
: client(bn::uri::uri(host), bn::uri::uri(auth)){}
client::client(const char * & host,
const std::string & auth)
: client(bn::uri::uri(host), bn::uri::uri(auth)){}
So my question is, what is the proper and easy way of doing this? Granted, I did all the permutations this time by hand, but in the future I could have 3+ variables to permute, and this would get ugly, quick.