Re: Template functions and avoiding implicit conversions
tarjei.knapstad@gmail.com <tarjei.knapstad@gmail.com> wrote:
Consider the following:
class CommandLineOptions
{
public:
template <typename ValueType>
void
Add(std::string& arg, bool required);
template <typename ValueType>
void
Add(std::string& arg, ValueType default);
};
The problem I have is that if I write something like:
CommandLineOptions clo;
clo.Add<std::string>("method", "invert");
I assume that you really mean the first argument to be a const
std::string &, or the conversion from char * to string should cause the
complier to complain about possing a temp as a non const reference.
boost or tr1's type_traits are your friend.
class Options
{
template <class T>
void do_it(const std::string &s,T x,std::tr1::true_type)
{
// convert x to bool and process.
}
template <class T>
void do_it(const std::string &s,T x,std::tr1::false_type)
{
// handle non bool's
}
public:
template <class T>
void Add(const std::string &,T x)
{
typedef typedef std::tr1::is_same<T,bool>::type choice;
do_it(s,t,choice());
}
};
using boost instead std::tr1:: becomse boost::
std::tr1::true_type becomse boost::mpl::true_;
std::tr1::false_type becomse boost::mpl::false_;
same logic.
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]