我有一组非常不同的类型,我希望将实例存储在单个集合中,特别是地图。为此,我使用类型擦除成语,即。我从该模板,类型特定类继承的非模板基类:类型擦除:在编译时检索值类型检查
struct concept
{
virtual std::unique_ptr<concept> copy() = 0; // example member function
};
template <typename T>
struct model : concept
{
T value;
std::unique_ptr<concept> copy() override { ... }
}
然后我店unique_ptrs到概念在我的地图。为了检索这个值,我有一个模板化的函数,它对指定的类型进行动态转换。
template <typename T>
void get(concept& c, T& out) {
auto model = dynamic_cast<model<T>>(&c);
if (model == nullptr) throw "error, wrong type";
out = model->value;
}
我不喜欢这个解决方案是,指定一个错误的T只在运行时检测到。我真的很喜欢这个在编译时完成。
我的选择是因为我看到下面,但我不认为他们能在这里帮助:
通过对每个类型的过载,或模板函数指定免费使用的功能特设多态性,但我不知道在哪里存储结果。
使用CRTP将不起作用,因为那么基类将需要模板化。
从概念上讲,我需要一个虚拟函数,它需要一个类的实例来存储结果。然而,由于我的类型是根本不同的,这个类需要模板化,这不适用于虚拟。
不管怎么说,我甚至不知道这在逻辑上是可行的,但如果有办法做到这一点,我会很高兴。
整个擦除类型是将类型分辨率移动到运行时。编译时检查没有多大意义。 – Frank
另外:你应该避免抛出原始字符串,而是使用'std :: exception'。 – Frank
你可能想要'variant'而不是你的基类。在这两种情况下,您都可以使用访问者。 – Jarod42