考虑以下概念问题:
template<class T> class foo {
std::map<text, T *> bar;
void push_back(T &t) { bar[(text) t] = t; }
}
这具有令人惊讶的有用属性(如果与其他容器结合使用),但并非没有限制。
特别是,你不能这样做;
class tagged: public text;
foo<shared_ptr<tagged>> c;
由于foo
与其内容不相关,shared_ptr
不应该是一个演员。
我们可以bar[(text) *t] = t
,但这只能解决问题。
所以相反,我一直试图想出一些更通用的东西,调用者定义如何投射。在伪:
template<class T, class Q = "text"> class foo {
std::map<Q, T *> bar;
void push_back(T &t) { bar[(Q) t] = t; }
}
自然以上不起作用。什么是优雅的解决方案?