c++ - 将枚举 TagLib::ID3v2::AttachedPictureFrame::Type 转换为字符串?
问题描述
我正在使用 c++ 的 taglib。如果我使用以下代码:
ID3v2::AttachedPictureFrame::Type t = picFrame->type();
例如,我得到“FrontCover (3)”,但我没有找到任何解决方案将其转换为字符串以保存值。
我还需要一个解决方案,如何设置ID3v2::AttachedPictureFrame::Type t
将其写入 APIC 标签。
解决方案
的文档TagLib::ID3v2::AttachedPictureFrame
说这Type
是该类中定义的枚举:
enum Type { Other = 0x00, FileIcon = 0x01, OtherFileIcon = 0x02, FrontCover = 0x03, BackCover = 0x04, LeafletPage = 0x05, Media = 0x06, LeadArtist = 0x07, Artist = 0x08, Conductor = 0x09, Band = 0x0A, Composer = 0x0B, Lyricist = 0x0C, RecordingLocation = 0x0D, DuringRecording = 0x0E, DuringPerformance = 0x0F, MovieScreenCapture = 0x10, ColouredFish = 0x11, Illustration = 0x12, BandLogo = 0x13, PublisherLogo = 0x14 }
没有自动转换将enum
s 符号转换为 astd::string
或反之亦然。此外,正如您注意到的那样,该类没有提供此类功能TagLib::ID3v2::AttachedPictureFrame
。
您需要为此实现辅助函数:
std::string attachedPictureFrameType2String(AttachedPictureFrame::Type type) {
switch(type) {
case AttachedPictureFrame::Other: return "Other";
case AttachedPictureFrame::FileIcon: return "FileIcon";
case AttachedPictureFrame::OtherFileIcon: return "OtherFileIcon";
case AttachedPictureFrame::FrontCover: return "FrontCover";
// All the other enum values ...
}
}
AttachedPictureFrame::Type string2AttachedPictureFrameType(const std::string& s) {
if(s == "Other") return AttachedPictureFrame::Other;
if(s == "FileIcon") return AttachedPictureFrame::FileIcon;
if(s == "OtherFileIcon") return AttachedPictureFrame::OtherFileIcon;
if(s == "FrontCover") return AttachedPictureFrame::FrontCover;
// All the other valid string values ...
throw std::exception("Invalid string");
}
正如@Uriya Harpeness在他们的评论中提到的,也可以使用字典来做到这一点,例如:
using std::pair<AttachedPictureFrame::Type,std::string> = TypeDictItem;
using std::vector<TypeDictItem> = TypeDict;
const TypeDict pictureFrameTypeDict = {
std::make_pair(AttachedPictureFrame::Other,"Other")
, std::make_pair(AttachedPictureFrame::FileIcon,"FileIcon")
, std::make_pair(AttachedPictureFrame::OtherFileIcon,"OtherFileIcon")
, std::make_pair(AttachedPictureFrame::FrontCover,"FrontCover")
// ...
};
std::string attachedPictureFrameType2String(AttachedPictureFrame::Type type) {
auto found = std::find_if(std::begin(pictureFrameTypeDict),
std::end(pictureFrameTypeDict),
[type](const TypeDictItem& i) { return i.first == type; } );
if(found != pictureFrameTypeDict.end()) {
return (*found).second;
}
throw std::exception("Unexpected enum value.");
}
AttachedPictureFrame::Type string2AttachedPictureFrameType(const std::string s) {
auto found = std::find_if(std::begin(pictureFrameTypeDict),
std::end(pictureFrameTypeDict),
[s](const TypeDictItem& i) { return i.second == s; } );
if(found != pictureFrameTypeDict.end()) {
return (*found).first;
}
throw std::exception("Invalid string.");
}
推荐阅读
- python - GitHub API:为分支启用推送限制
- r - DT::renderTable 闪亮验证
- c# - 在运行时不知道其中包含的文本时,在编码的 UI 中选择选中的列表框项控件
- jquery - select2 在 fooftable 内不起作用
- javascript - 使用锚标签提交表单
- jwt - asp.net core 2.0 登录请求的 400 状态
- python - 将日期添加到日期时间
- node.js - 'ng' 无法识别 - 通过电子运行 Angular 应用程序
- python-3.x - 如何在不冻结的情况下运行 tkinter GUI 应用程序?
- firebase - 如何扩展数千个 Firebase 应用实例