c++ - 如何将 `void *`类型改为 `string`类型

标签 c++ c++11

我提供了来自演示的代码,与字体关联的类型是 void * 类型。

这是在vscode中声明的字体类型

#define GLUT_BITMAP_HELVETICA_18 (&glutBitmapHelvetica18)
Expands to:

(&glutBitmapHelvetica18)

我正在尝试编写一个快速的小条件来检查字体是否来自列表。

if (find(begin(fonts), end(fonts), reinterpret_cast<char*>(font) ) != end(fonts))

我正在使用迭代器遍历字符串数组。

    array<string, 7> fonts = { 
      "GLUT_BITMAP_TIMES_ROMAN_24", 
      "GLUT_BITMAP_TIMES_ROMAN_10", 
      "GLUT_BITMAP_HELVETICA_12",
      "GLUT_BITMAP_HELVETICA_10",
      "GLUT_BITMAP_8_BY_13",
      "GLUT_BITMAP_9_BY_15" };

我的问题是,由于该数组中的所有元素都是字符串,因此它在 void *string 之间引发了类型错误。我不太确定如何将类型转换为 string 或者是否有更好的方法来检查 void * 是否在数组或什至是简单的列表中可能的选择。

最佳答案

GLUT_BITMAP_HELVETICA_18 是指向表示位图字体的对象的指针。它不是指向字符串或字体名称的指针。

你可以按照你的要求去做,但是你会想要一个代表字体的 void* 数组:

array<void*, 7> glut_fonts { 
  GLUT_BITMP_TIMES_ROMAN_24, 
  GLUT_BITMAP_TIMES_ROMAN_10, 
  GLUT_BITMAP_HELVETICA_12,
  GLUT_BITMAP_HELVETICA_10,
  GLUT_BITMAP_8_BY_13,
  GLUT_BITMAP_9_BY_15 
};

现在,我们可以像您希望的那样使用find:

if (find(begin(glut_fonts), end(glut_fonts), font) != end(glut_fonts)) {
    // Do stuff if the given font exists
}

我们也可以用这个来获取名字:

array<string, 8> font_names = { 
  "GLUT_BITMAP_TIMES_ROMAN_24", 
  "GLUT_BITMAP_TIMES_ROMAN_10", 
  "GLUT_BITMAP_HELVETICA_12",
  "GLUT_BITMAP_HELVETICA_10",
  "GLUT_BITMAP_8_BY_13",
  "GLUT_BITMAP_9_BY_15",
  "[unknown font]"
};

// Get the index of the font
// std::distance comes from <iterator>
auto index = distance(begin(glut_fonts), find(begin(glut_fonts), end(glut_fonts), font))

string name = font_names[index]; 

关于c++ - 如何将 `void *`类型改为 `string`类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55437598/

相关文章:

c++ - 创建成员指向 int 或 short int 的结构数组?

c++ - 如何在条件中展开可变参数模板?

c++ - 为什么 push_back() 会导致 malloc() 处理的数据崩溃?

c++ - 为什么不可能按值传递这种大小可变的参数?

c++ - 了解 memory_order_relaxed

c++ - 告诉 gcc/g++ 编译器删除孤立函数

c++ - 巧妙破坏的 C++ 代码的邪恶样本

c++ - 如何安全地将整数类型转换为作用域枚举

C++ 默认构造函数与具有非平凡默认构造函数的变体成员 union

c++ - 如何将static_cast转换为变量类型