字典以下面的“类型”词典 - 其键应该是类型和数值,其类型的实例:与编译时密钥,或类型作为键
class TypeDictionary {
public:
template<class T> void insert(T t);
template<class T> T& get();
// implementation be here -- and the question is about this
};
struct Foo;
struct Bar;
void userOfTypeDictionary() {
TypeDictionary td;
td.insert(Foo());
td.insert(Bar());
td.insert(double(3.14));
// and other unknown (to TypeDictionary)
// list of types attached
// later on, in a different scope perhaps
Foo& f = td.get<Foo>() ;
Bar& f = td.get<Bar>();
double pi = tg.get<double>();
// ...
}
此特定TypeDictionary具有越来越多的类型被“注册”,但是当然,该设施应该允许任意类型的集合,并且可能为这个类的每个实例设置不同的集合。
至于一个现实的激励用例,请考虑插件管理器。在其任何特定时间,都会附加一组任意的异构对象,而管理者的工作是管理附加对象的生命周期,并在以类型安全的方式查询时返回(引用)给它们。
关于这种事情是否可能的任何想法?如果一个策略涉及使用一个库,比如Boost.Fusion或类似的,那就好了。
感谢您的回答!因此,当你形象化第一个元组版本并没有解决最重要的规范,那就是类型列表没有预定义(如果是的话,Boost.Fusion可以很好地使用,特别是boost ::融合::设置)。下半部分的评论更有意思,实际上,每次插入都有一个不同的基础类型。但是,如果TypeDisctionary以某种方式管理它,通过某种类型的擦除或其他方式,它会更有趣。 – Nick
您可以使用[boost :: any]之类的东西(http://www.boost.org/doc/libs/1_55_0/ doc/html/any.html),尽管它包含令人讨厌的低级代码,如果我没有记错的话,它使用免费商店(我做了一个类似的库,至少不使用免费商店) 。这使得异构容器成为可能,但它本身并不能解决在不同类型中搜索给定密钥的问题。 – iavr