注意:我知道以前在SO上也问过类似的问题,但我觉得它们没有帮助或非常清楚。
第二点注意:对于这个项目/任务的范围,我试图避免使用第三方库,比如Boost。
我想看看是否有一种方法可以让一个向量在它的每个索引中包含多种类型。例如,假设我有以下代码示例:
vector<something magical to hold various types> vec;
int x = 3;
string hi = "Hello World";
MyStruct s = {3, "Hi", 4.01};
vec.push_back(x);
vec.push_back(hi);
vec.push_back(s);
我听过向量
在我的实际应用中,我知道哪些可能的类型可能被插入到一个向量中,但是这些类型并不都来自同一个超级类,并且不能保证所有这些类型都会被推到向量上或者以什么顺序。
有没有一种方法可以安全地实现我在代码示例中演示的目标?
谢谢你的时间。
为了做到这一点,您肯定需要一个包装器类以某种方式对向量隐藏对象的类型信息。
当您以前存储了Type-B时,当您试图恢复Type-A时,让这个类抛出异常可能也很好。
这是我的一个项目中Holder类的一部分。你大概可以从这里开始。
注意:由于使用了不受限制的联合,这只适用于C 11。更多关于这方面的信息可以在这里找到:在C 11中,什么是无限制的联合?
class Holder {
public:
enum Type {
BOOL,
INT,
STRING,
// Other types you want to store into vector.
};
template<typename T>
Holder (Type type, T val);
~Holder () {
// You want to properly destroy
// union members below that have non-trivial constructors
}
operator bool () const {
if (type_ != BOOL) {
throw SomeException();
}
return impl_.bool_;
}
// Do the same for other operators
// Or maybe use templates?
private:
union Impl {
bool bool_;
int int_;
string string_;
Impl() { new(&string_) string; }
} impl_;
Type type_;
// Other stuff.
};
根据建议,您可以使用各种形式的联合、变体等。如果您可以在基类接口中定义所有必要的操作,外部多态可以根据您想要对存储的对象做什么来做。
下面是一个示例,如果我们只想将对象打印到控制台:
#include <iostream>
#include <string>
#include <vector>
#include <memory>
class any_type
{
public:
virtual ~any_type() {}
virtual void print() = 0;
};
template <class T>
class concrete_type : public any_type
{
public:
concrete_type(const T& value) : value_(value)
{}
virtual void print()
{
std::cout << value_ << '\n';
}
private:
T value_;
};
int main()
{
std::vector<std::unique_ptr<any_type>> v(2);
v[0].reset(new concrete_type<int>(99));
v[1].reset(new concrete_type<std::string>("Bottles of Beer"));
for(size_t x = 0; x < 2; ++x)
{
v[x]->print();
}
return 0;
}
由std::vector保存的对象
#include <algorithm>
#include <iostream>
class any
{
private:
struct base {
virtual ~base() {}
virtual base* clone() const = 0;
};
template <typename T>
struct data: base {
data(T const& value): value_(value) {}
base* clone() const { return new data<T>(*this); }
T value_;
};
base* ptr_;
public:
template <typename T> any(T const& value): ptr_(new data<T>(value)) {}
any(any const& other): ptr_(other.ptr_->clone()) {}
any& operator= (any const& other) {
any(other).swap(*this);
return *this;
}
~any() { delete this->ptr_; }
void swap(any& other) { std::swap(this->ptr_, other.ptr_); }
template <typename T>
T& get() {
return dynamic_cast<data<T>&>(*this->ptr_).value_;
}
};
int main()
{
any a0(17);
any a1(3.14);
try { a0.get<double>(); } catch (...) {}
a0 = a1;
std::cout << a0.get<double>() << "\n";
}
我已经设置了一个geoserver与Postgres/PostGIS数据存储和启用geoserver矢量插件。在geoserver中加载图层后,可以使用geoserver门户提供的开放图层界面查看地图。在这之后,我一直在尝试让这些瓷砖在前端使用OpenLayers渲染,遵循这里的教程。 该代码对于教程中给出的示例世界地图数据来说就像魅力一样,但是当试图渲染我在Postgres数据存储中拥有的任何其
问题内容: 我想将JPanel中的图像导出到矢量图形文件中,以便可以以高于屏幕的分辨率对其进行编辑和打印。本质上,我希望使用目标图形调用它的功能,该目标图形将绘图命令保存到矢量图形文件中。 有什么好的简单方法呢?推荐哪些库?哪种矢量格式最好,为什么? 问题答案: 看看Java EPS Graphics2D包。 许多Java程序都使用Graphics2D在屏幕上绘制内容,虽然很容易将输出另存为png
一、基础配置 第一步:创建个推账号 如没有个推账号,需要创建个推推送账号及应用,获得AppID、AppKey和Master Secret 参数。如下图所示: 第二步:在智能触达中配置个推账号 在诸葛「智能触达→设置→触达渠道→推送消息」中,找到「个推推送」,填入上一步中得到的AppKey和Master Secret参数并完成开通。 第三步:确认SDK中添加推送逻辑代码 按照个推最新的开发文档集成时
我想在现场放置六个物体(球)。我认为代码看起来可行,但我收到一个控制台消息。信息: “Assets/GameScripts/Instance.cs(26,40):错误CS0266:无法将typeUnityEngine.Vector3”。存在显式转换(是否缺少转换?) 使用UnityEngine;使用系统。收藏; 公共类实例:单行为{公共游戏对象球; }
问题内容: 我出现了不想要的行为,即,它更改了进入原始函数的参数的数据类型。我最初的问题是关于一般情况的,我将使用这个新问题来提出更具体的情况。 (为什么要问第二个问题?为了说明问题,我创建 了一个关于更具体案例 的问题-从具体问题到更一般的问题总是比较容易。而且我 单独 创建了这个问题,因为我认为这是有助于保持一般情况以及对一般情况的答复(应该找到),而不会因为考虑解决任何特定问题而受到“污染”
你好,我想上传多张图片到firebase。目前我可以上传1张图片。尽管如此,我还是决定将所有内容作为HTML,比如标题、描述和图像,放在一个webview中,并从那里显示出来。目前,这项工作还不错,我在firebase中有一个字符串,包含所有这些内容: 不过,正如您所见,这只是本地存储的工作形式。如何下载这些图像并用正确的firebase图像URL替换图像src。