Hello!
I am using templates to implement a range checked conversion from int to enum. It looks like this:
template<typename E>
E enum_cast(const int &source);
The template function placed more or less in the root-directoy of the project. When defining a new enum that is foreseen to be assigned values from a config file like this:
enum ConfigEnum {
ConfigEnumOption1 = 'A'
, ConfigEnumOption2 = 'B'
, ConfigEnumInvalid };
ConfigEnum option = XmlNode.iAttribute("option");
I define a template specialization for this particular enum type in a .cpp-file for the module this enum is used in.
template<>
ConfigEnum enum_cast(const int &source) {
switch(source) {
case ConfigEnumOption1 : return ConfigEnumOption1;
case ConfigEnumOption2 : return ConfigEnumOption2;
default return ConfigEnumInvalid;
}
Now the assignment of an int to the enum becomes:
ConfigEnum option = enum_cast<ConfigEnum>(XmlNode.iAttribute("option"));
which makes sure that the enum is allways in valid range. Note that I have not allways control over these enums so this seems to a be reasonable and easily configureable solution.
Anyway, this works all very well (although I am not shure all code given here is correct because I just recall it from memory right now)
The problem stems from the fact that it might be desireable to use this "enum_cast" construct thorughout the code base whenever an in is assigned to a enum. After all this can be enforced by a simple search-and-replace operation. Of course I do not want to define these specializations for all and every enum around but only for those that need the range check at the moment. I would prefer to add template specializations for the enum types when the need arises and use the assignment operator when no specialization is defined.
Thus:
InternalEnum internal = enum_cast<InternalEnum>(internal_integer);
would effecively call internal = internal_integer. I figure that I need to tell the compiler to use a certain "default" implementation for all enum types that do not have a specialization.
My first bet was giving the original template function an implementation like this:
template<typename E>
E enum_cast(const int &source) {
E copy = source;
return copy;
};
Unfortunately now this is allways called instead of the specialiazations given in the .cpp-files deeper into the project directory-tree.
Any thoughts?
Thanks in advance Arne