gpt4 book ai didi

c++ - 创建一个将字符串常量返回给枚举的类的廉价方法,反之亦然?

转载 作者:太空宇宙 更新时间:2023-11-04 15:11:54 24 4
gpt4 key购买 nike

这样做更好吗:

class Foo{

std:string option1(MY_ENUM type){
static const std:string f1 = "a";
static const std:string f2 = "b";
static const std:string f3 = "c";
// ...
switch (type) {
case (TYPE_1):{
return f1;
break;
}
case (TYPE_2):{
return f2;
break;
}
// ...
}
}

或者这样做:

class Foo {
private:
const std:string f1 = "a";
const std:string f2 = "b";
const std:string f3 = "c";

public:
std:string option1(MY_ENUM type){

// ...
switch (type){
case (TYPE_1):{
return f1;
break;
}
case (TYPE_2):{
return f2;
break;
}
// ...
}
}

同样,我会做一些类似的事情来将枚举转换为字符串。将字符串在函数中保留为静态常量更好,还是在类中保留为私有(private)更好?- 除了我,没有其他人会编辑类(class)。- 类中的任何其他函数是否知道字符串的值并不重要,因为它是 const,所以无论如何都不能修改它。

哪个更便宜并且在运行时和编译期间的开销更少?哪种做法更好?

最佳答案

更便宜的做法是完全不使用 std::string,因为它可能需要运行时初始化,并且还使用查找表将枚举转换为字符串:

const char *enumToStr(MY_ENUM type) {
static const char *const names[] = { "a", "b", "c" };
if (type < sizeof(names) / sizeof(names[0]))
return names[type];
return nullptr;
}

不幸的是,您不能使用这种技巧进行反向转换。此外,这还假设您的枚举器具有连续的数值,并且在添加或重新排序枚举值时应小心。

至于“将这些值放在哪里”的问题,从“开销”的角度来看并不重要,只要这个数组是静态的或全局的即可。我建议将它放入定义这些转换函数的 *.cpp 文件内的匿名命名空间内的全局变量中,以便它可以用于这两个函数,但在该翻译单元之外不可见:

namespace {
const char *const names[] = ...;
}

关于c++ - 创建一个将字符串常量返回给枚举的类的廉价方法,反之亦然?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55499698/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com