如何将“ void *”类型更改为“ string”类型

时间:2019-03-31 03:21:33

标签: 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 *是否在数组中,甚至是简单的可能选项列表。

1 个答案:

答案 0 :(得分:2)

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];