Hi All,
I am looking to replace Loki with Boost since we use Boost
for other parts of projects. Example of current situation:
template<typename T>
struct param_traits {};
template<>
struct param_traits<long> {
typedef
long param_type;
static param_type init() { return
0; }
static bool fromString(const
string &str, param_type &value, int base) {
//
Do conversion
}
static string toString(param_type
&value, const string &fmt) {
//
Do conversion
}
};
template<>
struct param_traits<double> {
typedef
double param_type;
static param_type init() { return
0.0; }
static bool fromString(const
string &str, param_type &value, int base) {
//
Do conversion
}
static string toString(param_type
&value, const string &fmt) {
//
Do conversion
}
};
Class BaseParamValue {
public:
virtual
~BaseParamValue() {};
virtual
bool fromString(const string &str, int base = 0) = 0;
virtual
string toString(const string &ftm = “”) = 0;
static
BaseParamValue *create(const string &type) {
if
(type == string(“LONG”)) {
return
new ParamValue<long>();
}
else if (type == string(“DOUBLE”)) {
return
new ParamValue<double>();
}
return
0;
}
};
template<typename T>
class ParamValue : public BaseParamValue {
public:
typedef
param_traits<T> traits_type;
typedef
typename traits_type::param_type ParamType;
ParamValue()
:
mValue()
{
}
~ParamValue() {};
bool fromString(const string
&str, int base) {
return
traits_type::fromString(str, mValue, base);
}
string toString(const string
&fmt) {
return
traits_type::toString(mValue, fmt);
}
private:
ParamType
mValue;
};
class Param {
public:
Param()
:
mParamValue(0)
{
}
Param(const
string &type) :
mParamValue(BaseParamValue::create(type))
{
}
~Param() {
delete
mParamValue;
}
private:
BaseParamValue
*mParamValue;
};
So as you can see I store a BaseParamValue in the param
class instead of making the Param class itself a template, which is not an
option at the moment. I am currently using loki StaticDispatcher to up cast (I
guess) to the correct templatized instance in the operations. What I am trying
to get done is the following:
class TestVisit {
public:
TestVisit();
~TestVisit();
void
visit(const ParamValue<long> &value);
void visit(const ParamValue<double>
&value);
};
Is there a way in Boost to go from a BaseParamValue * to the
actual templatized ParamValue and call the correct visit using: testVisit.visit(*mParamValue).
Currently I get a compiler error saying: cannot conver parameter 1 from ‘BaseParamValue’
to ‘const ParamValue<T> &’
Sorry for the long post, thanks in advance.
Glenn