Parag Gadkari writes:
It could be the way you are trying to pass parameters. Can you post a snippet
of what you are trying to do?
Well, I tried to obtain something smaller, but I failed.
Due to copyright restrictions I post only excerpts to give you an idea.
Most of the code passed gcc-4.0.3 (cygwin), so I blame the compiler until
proven wrong (looking forward to Service Pack 1).
#include
#include
#include
#include
#include
[...]
#include <string>
#include <iostream>
[...]
struct int_string_pair
{
int i_;
std::string s_;
int_string_pair(int i, std::string const & s)
: i_(i)
, s_(s)
{}
};
struct as_int {};
struct as_string {};
// shortcut for typedef
struct property_storage
{
typedef int_string_pair value_type;
typedef boost::multi_index::multi_index_container<
value_type,
boost::multi_index::indexed_by
,
boost::multi_index::
ordered_unique,
boost::multi_index::member >,
boost::multi_index::
ordered_unique,
boost::multi_index::member >
> > value_storage_t;
};
template <typename T>
class CConfigurationProperty
{
public:
typedef property_storage::value_type value_type;
typedef property_storage::value_storage_t value_storage_t;
private:
value_type m_Value;
value_type GetCheckedValue(int i)
{
value_storage_t const & possible_values = T::PossibleValues();
value_storage_t::index_iterator::type it =
boost::multi_index::get(possible_values).find(i);
ENFORCE(it != boost::multi_index::get(possible_values).end())
("Trying to assign invalid value '")(i)
("' to configuration property.");
return value_type(*it);
}
value_type GetCheckedValue(std::string const & s)
{
value_storage_t const & possible_values = T::PossibleValues();
value_storage_t::index_iterator::type it =
boost::multi_index::get(possible_values).find(s);
ENFORCE(it != boost::multi_index::get(possible_values).end())
("Trying to assign invalid value '")(s)
("' to configuration property.");
return value_type(*it);
}
public:
CConfigurationProperty()
: m_Value(GetCheckedValue(T::DefaultValue()))
{}
CConfigurationProperty(int i)
: m_Value(GetCheckedValue(i))
{}
CConfigurationProperty(std::string const & s)
: m_Value(GetCheckedValue(s))
{}
CConfigurationProperty(char const * s)
: m_Value(GetCheckedValue(std::string(s)))
{}
operator int() const
{
return m_Value.i_;
}
operator std::string() const
{
return m_Value.s_;
}
CConfigurationProperty<T> & operator=(int i)
{
m_Value = GetCheckedValue(i);
return *this;
}
CConfigurationProperty<T> & operator=(std::string const & s)
{
m_Value = GetCheckedValue(s);
return *this;
}
CConfigurationProperty<T> & operator=(char const * s)
{
m_Value = GetCheckedValue(std::string(s));
return *this;
}
};
[...]
struct example_type
: public property_storage
{
static
value_storage_t const &
PossibleValues()
{
static value_storage_t const possible_values =
boost::assign::list_of
(-1, "undefined")
(0, "foo")
(1, "bar");
return possible_values;
}
static int DefaultValue() { return -1; }
};
typedef CConfigurationProperty example_type_t;
example_type_t test;
test = "foo";
assert(test != "bar");
assert(test == 0);