c – 我可以根据类型ID实现其签名只有不同的模板化函数吗?

c – 我可以根据类型ID实现其签名只有不同的模板化函数吗?,第1张

概述这是一些枚举类: enum class Race : char {AINU, ELF, DWARF, MAN, EAGLE, HOBBIT, ENT, ORC, WIZARD};enum class Color: char {RED, ORANGE, YELLOW, GREEN, BLUE, PURPLE};enum class Direction: char{UP, DOWN, LEFT, 这是一些枚举类:
enum class Race : char {AINU,ELF,DWARF,MAN,EAGLE,HOBBIT,ENT,ORC,WIZARD};enum class color: char {RED,ORANGE,YELLOW,GREEN,BLUE,PURPLE};enum class Direction: char{UP,DOWN,left,RIGHT};

我想为每个实现一个enum_to_string函数和一个string_to_enum函数.
将枚举转换为字符串没有问题,因为我可以重载相同的函数名称.

std::string to_string(Race const& enum_value);std::string to_string(color const& enum_value);std::string to_string(Direction const& enum_value);

但是,转换为枚举时,不能以相同的方式重载,因为只有返回类型才会不同. (我也不想,因为不同的枚举可以用相同的字符串表示.)

将字符串转换为枚举可以使用以下方法之一吗?

Race race = to_enum<Race>("elf");color color = to_enum<color>("green");std::string blah{"up"};Direction dir{to_enum<Direction>(blah)};

或者可能:

Race race = to_enum(Race,"elf");color color = to_enum(color,"green");std::string blah{"up"};Direction dir{to_enum(Direction,blah)};

C可以支持这些行为中的一个或两个吗?

我试图避免像这样的不同函数名称:

Race to_race(std::string const& str);color to_color(std::string const& str);Direction to_direction(std::string const& str);

这是我能想到的最接近的事情,

template <typename T>struct to_enum{};template <>struct to_enum<color>{    static color convert(std::string const& str){        //match the string with a color enum,and return that color enum        //(or like a default color enum if the string is garbage or something)    }};

然后你这样称呼它:

color color = to_enum<color>::convert("red");

我们可以摆脱皈依者吗?或者可能实施这个?

color color = to_enum(color,"red");
解决方法 使用功能模板和专业化.在极少数情况下,我认为功能专业化确实有帮助.
template<typename TEnum>TEnum enum_cast(std::string const & s);

然后专门为每个枚举类型.我改了名字,所以你可以像演员一样读它:

color color = enum_cast<color>("blue");

或解析也是一个好名字.选择你认为好的任何东西.我会亲自选择解析或enum_cast.

现在对于to_string,您可以定义重载(您已经拥有):

std::string to_string(color c);std::string to_string(Race r);std::string to_string(Direction d);

不要对to_string使用模板和专门化.一般来说,超载确实很好.

总结

以上是内存溢出为你收集整理的c – 我可以根据类型ID实现其签名只有不同的模板化函数吗?全部内容,希望文章能够帮你解决c – 我可以根据类型ID实现其签名只有不同的模板化函数吗?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1234734.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存