【发布时间】:2017-11-17 15:57:49
【问题描述】:
我需要一个包含不同值类型的映射。我使用从B 派生的T 类型的派生模板类Derived 实现了这一点,并使用指向基类Base 的指针声明我的地图,如下所示:
class Base {
public:
~Base(){}
};
template <class T>
class Derived: public Base {
public:
Derived(T value) {
this->value = value;
}
T value;
};
std::map<std::string, std::shared_ptr<Base>> my_map;
using KeyValuePair = std::pair<std::string, std::shared_ptr<Base>>;
my_map.insert(KeyValuePair("foo1",std::make_shared<Derived<int>>(10)));
my_map.insert(KeyValuePair("foo2",std::make_shared<Derived<double>>(20.0)));
my_map.insert(KeyValuePair("foo3",std::make_shared<Derived<std::string>>("bla")));
例如,我现在想打印地图条目的值
for (auto const& x : my_map)
{
std::cout << *x.get() << std::endl;
}
但是,我现在遇到的问题是我无法通过将x 转换为Derived 来访问Derived 类中的成员,因为我不知道模板参数的类型。所以以下是不可能的:
std::shared_ptr<Derived<?>> derived = std::dynamic_cast<Derived<?>>(x);
我曾想过在Base 类中有一个返回成员的虚函数,但我不知道返回类型,所以不是一个选项。
我也不想为多个返回类型指定多个虚函数,因为代码的重点是避免复制代码并具有“通用映射”
但是,我没有看到其他解决方案,除了通过返回类似以下的流式 boost::any 来使用一些花哨的 boost 魔法,因为这会删除有关类型的任何信息。
using streamable_any = boost::type_erasure::any<boost::mpl::vector<
boost::type_erasure::copy_constructible<>,
boost::type_erasure::destructible<>,
boost::type_erasure::ostreamable<>>>;
实现我想要的目标有哪些可能性?我怀疑我需要考虑更改设计。
【问题讨论】:
-
你有什么想要继承的理由吗?
-
如果您可以使用 C++17,您应该查看
boost::variant或std::variant -
您希望对类型
T执行多少次操作? -
T有几种类型?列表是否在某处有界和可枚举? -
@Yakk:我只会有几个基本类型
T,不会超过10个。我只需要能够设置和获取T的值
标签: c++ templates inheritance