问题描述
我正在使用用于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
的符号转换为std::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在其comment中提到,也可以使用字典来做到这一点,例如:
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),[s](const TypeDictItem& i) { return i.second == s; } );
if(found != pictureFrameTypeDict.end()) {
return (*found).first;
}
throw std::exception("Invalid string.");
}