我正在尝试为我的项目设计一个缓存机制。基本上,我需要一个从字符串到值的映射,但是,我需要在运行时打开并确定该值。
我需要的是关于如何实现这一点的建议。
我的设计现在是:
boost::any
保存值std::unordered_map<std::string, boost::any>
作为容器我希望会员回馈原始类型,因为我希望缓存尽可能透明。用户应该使用这样的东西:
double &p = cache.get("p");
std::string &q = cache.get("q");
hugeclass &r = cache.get("r");
我正在考虑代替boost::any
值,这样的私有结构:
struct internal
{
boost::any value;
template <typename T>
T& get() { return boost::any_cast<T&>(value); } // Possible?
}
然而,我真的不知道这样的事情是否可能,或者如何真正得到这个。
那么,我怎样才能获得一个透明的缓存类,它返回对保持值的引用?
谢谢!
答案 0 :(得分:1)
你可能可以逃脱这个:
double &p = cache.get<double>("p");
std::string &q = cache.get<std::string>("q");
hugeclass &r = cache.get<hugeclass>("r");
否则,我认为你的要求是不可能的。
更新:您可以尝试这样的设计:
double p;
cache.get("p", p);
使用get
,如下所示:
template <typename T>
bool get(const std::string &key, T &output) const {
// lookup...
// return false if lookup failed
output = boost::any_cast<T&>(...);
return true;
}