我有一个有趣的问题,在我的一种基于传递的编译器中出现了.每个传递都不知道其他传递,并且在命令模式链之后,一个公共对象沿着链传递.
传递的对象是对文件的引用.
现在,在其中一个阶段中,人们可能希望关联大量数据,例如该文件的SHA512哈希,这需要合理的时间来计算.但是,由于该块数据仅用于该特定情况,因此我不希望所有文件引用都需要为该SHA512保留空间.但是,我也不希望其他传递必须一遍又一遍地重新计算SHA512哈希.例如,某人可能只接受与给定SHA512列表匹配的文件,但是当文件引用到达链的末尾时,或者他们想要两者或者...... .etc时,他们不希望打印该值.
我需要的是某种容器,它只包含给定类型中的一种.如果容器不包含该类型,则需要创建该类型的实例并以某种方式存储它.它基本上是一个字典,其类型是用来查找的东西.
这是我到目前为止所获得的,相关的位是FileData::Get<t>方法:
class FileData;
// Cache entry interface
struct FileDataCacheEntry
{
virtual void Initalize(FileData&)
{
}
virtual ~FileDataCacheEntry()
{
}
};
// Cache itself
class FileData
{
struct Entry
{
std::size_t identifier;
FileDataCacheEntry * data;
Entry(FileDataCacheEntry *dataToStore, std::size_t id)
: data(dataToStore), identifier(id)
{
}
std::size_t GetIdentifier() const
{
return identifier;
}
void DeleteData()
{
delete data;
}
};
WindowsApi::ReferenceCounter refCount;
std::wstring fileName_;
std::vector<Entry> cache;
public:
FileData(const std::wstring& fileName) : fileName_(fileName)
{
}
~FileData()
{ …Run Code Online (Sandbox Code Playgroud) 我试图为可以附加到我的对象的可能元数据创建一个容器.我可以保证每类最多只有一个对象附加到我的班级,但是对于不同类型的对象没有限制.例如,我不能将两个实例附加wordInfo到一个对象,但是wordInfo和的实例phraseInfo可以同时附加到一个对象.这是我到目前为止完成的工作.
class object
{
std::map <std::type_info, object*> mMetaData;
public:
inline void attachMetaData(object* pData)
{
mMetaData[typeid(*pData)] = pData;
}
template <class T> inline std::enableif<std::is_base_of<object,T>::value, T*>::type getMetaData()
{
if (mMetaData.find(typeid(T)) == mMetaData.end())
return NULL;
else
return mMetaData[typeid(T)];
}
template <class T> inline std::enableif<std::is_base_of<object,T>::value, void>::type detachMetaData()
{
mMetaData.erase(typeid(T));
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码有一个编译错误:没有定义更少的运算符std::type_info所以我专门定义了一些较少的类std::type_info,并将它作为map类的第三个模板参数传递,如下所示:
struct typeinfoless
{
bool operator()(std::type_info& left, std::type_info& right)
{
return left.hash() < right.hash();
}
}
std::map <std::type_info, object*, typeinfoless> mMetaData;
Run Code Online (Sandbox Code Playgroud)
但后来我遇到了另一个错误,我不知道如何解决,std::type_info …