我已从演示中提供了代码,并且与字体关联的类型为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 *
是否在数组中,甚至是简单的可能选项列表。
答案 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];