我正在使用模板来实现从int到枚举的范围检查转换。它看起来像这样:模板功能专业化问题
template<typename E>
E enum_cast(const int &source);
模板函数或多或少放置在项目的root-directoy中。当定义一个已经预见到从一个配置文件这样分配值的新的枚举:
enum ConfigEnum {
ConfigEnumOption1 = 'A'
, ConfigEnumOption2 = 'B'
, ConfigEnumInvalid };
ConfigEnum option = XmlNode.iAttribute("option");
我定义为在一个.cpp文件此枚举中使用的模块此特定枚举类型一个模板特。
template<>
ConfigEnum enum_cast(const int &source) {
switch(source) {
case ConfigEnumOption1 : return ConfigEnumOption1;
case ConfigEnumOption2 : return ConfigEnumOption2;
default return ConfigEnumInvalid;
}
现在一个int到枚举的分配变为:
ConfigEnum option = enum_cast<ConfigEnum>(XmlNode.iAttribute("option"));
这可确保枚举是在百达有效范围。请注意,我并不总是控制这些枚举,所以这似乎是一个合理且易于配置的解决方案。
不管怎么说,这个工作都非常好(虽然我不是舒尔这里给出所有的代码是正确的,因为我刚刚从存储器中调用它现在)
问题来源于这样的事实,这可能是desireable使用每当in被分配给一个枚举时,这个“enum_cast”构造就会遍历代码库。毕竟这可以通过简单的搜索和替换操作来实施。当然,我不想为所有和每个枚举定义这些专门化,但仅限于那些需要进行范围检查的人员。我希望在需要时为枚举类型添加模板特化,并在未定义专门化时使用赋值运算符。
因此:
InternalEnum internal = enum_cast<InternalEnum>(internal_integer);
将effecively调用内部= internal_integer。我想我需要告诉编译器对所有没有专门化的枚举类型使用某个“默认”实现。
我的第一个赌注是给原始模板功能的实现是这样的:
template<typename E>
E enum_cast(const int &source) {
E copy = source;
return copy;
};
不幸的是,现在这是所谓的百达而不是在.cpp,文件给出深入到项目目录树的specialiazations。
有什么想法?
在此先感谢 阿恩
感谢提示 - 像往常一样,很容易,一旦你知道答案;-) – Arne 2009-08-20 09:25:15