- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在寻找一个提供容器的库,例如 std::array
(编译时固定大小,但不支持聚合初始化)和 std::vector
(可变大小,连续内存)适用于不可复制且不可默认构造的类型。
具体来说,我希望能够将一组函数传递给构造函数,这些函数用于获取所包含对象的构造函数的参数。类似于 emplace_back
,但作为构造函数并使用惰性求值参数。
这是一个(自然不起作用的)示例:
class stubborn_type : boost::noncopyable {
public:
explicit stubborn_type(int value)
: value(value)
{}
private:
const int value;
};
struct generate_values {
generate_values(int initial_value = 0)
: current_value(initial_value)
{}
int operator()() {
return current_value++;
}
private:
int current_value;
};
/* This should create a vector containing 10 elements initialized with the values
[0..9] in order. */
magic::vector<stubborn_type> data(10, generate_values());
我需要解决方案与 C++03 兼容(因为这意味着没有可变参数模板,我更喜欢使用预处理器魔术为不同数量的参数生成重载的 Boost 方法,但合理的固定限制很好出色地)。这样的东西存在吗?如果没有,是否有任何库可以帮助实现该目标(例如,Boost.In Place Factory 几乎很有用,但它不支持惰性参数)。
最佳答案
我不知道有什么现成的解决方案,但是,做起来并不难。数组的轮廓可能看起来像这样
#include <cstddef>
typedef char saum;
// smallest addressable unit of memory
namespace magic {
template<class T>
class IArray
{
T *const _ptr;
const size_t _length;
public:
operator T* () {
return _ptr;
}
size_t length() const {
return _length;
}
private:
IArray<T>(T* ptr, size_t length)
: _ptr(ptr), _length(length)
{}
template<class S, size_t length>
friend class Array;
};
template<class T>
class Generator
{
public:
virtual void operator() (T* place) = 0;
};
template<class T, size_t length>
class Array
{
saum buffer[sizeof(T) * length];
public:
Array(Generator<T>& generate) {
for (size_t i = 0; i < length; i++)
generate((T*)buffer + i);
}
~Array() {
for (size_t i = 0; i < length; i++)
((T*)buffer)[i].~T();
}
operator IArray<T> () {
return IArray<T>((T*)buffer, length);
}
operator T* () {
return (T*)buffer;
}
};
}
我有点累了,请原谅我没有想出更好的名字。然而,它应该完成这项工作。也许,生成器的解决方案不是太漂亮,但仍然提供了灵 active 。我相信更多的羽毛不会造成问题。
一个例子
#include <new>
#include <iostream>
class Stubborn
{
public:
Stubborn(int value) : value(value*2) { }
const int value;
private:
Stubborn(const Stubborn&);
Stubborn& operator=(const Stubborn&);
};
struct StubbornGen : public magic::Generator<Stubborn>
{
StubbornGen() : current_value(0)
{}
void operator() (Stubborn* place) {
new(place) Stubborn(current_value++);
}
private:
int current_value;
};
void f(magic::IArray<Stubborn> stubs)
{
std::cout << stubs[0].value << stubs[1].value
<< stubs[2].value << stubs[3].value
<< " " << stubs.length() << std::endl;
}
int main(int argc, char *argv[])
{
StubbornGen gen;
magic::Array<Stubborn, 4> stubs(gen);
f(stubs);
}
编辑:已更正,感谢 DyP,加上生成器调整。
重要的是为 Array 定义复制构造函数和赋值运算符,以避免 DyP 指出的问题。 - 如何? - 取决于你想要什么。将它们设为私有(private)是一种方法。而进行非浅拷贝是另一回事。 - 在第二种情况下,模板实例化机制应该防止在将不可复制的类应用到数组时出错。
关于c++ - 是否有任何库为不可默认构造的不可复制类型提供容器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16339418/
我正在尝试将抓取的 xml 输出写入 json。由于项目不可序列化,抓取失败。 从这个问题来看,它建议您需要构建一个管道,未提供的答案超出了问题 SO scrapy serializer 的范围。 所
有没有一种方法可以通过重载函数来区分参数是在编译时可评估还是仅在运行时可评估? 假设我有以下功能: std::string lookup(int x) { return table::va
我正在使用 MVVM 模式编写一个应用程序。我通过将 View 的 DataContext 属性设置为 ViewModel 的实例来向 View 提供数据。一般来说,我只是从那里使用 Binding
对于一个项目,我正在使用带有简单 python module 的传感器收集多个红外命令。 . 我收到如下字节字符串: commando1= b'7g4770CQfwCTVT9bQDAzVEBMagGR
我有一个计算方法,可以在用户使用 Cartridge 作为我的商店框架结账时计算税费。 税 = 税 * 小数(str(settings.SHOP_DEFAULT_TAX_RATE)) 计算工作正常。然
我正在用 pygame 制作一个绘图程序,我想在其中为用户提供一个选项来保存程序的确切状态,然后在稍后重新加载它。在这一点上,我保存了我的全局字典的副本,然后遍历, pickle 每个对象。 pyga
在 C++11 之前,我可以使用它来使类不可复制: private: MyClass(const MyClass&); MyClass& operator=(const MyClass&); 使用 C
大家好 :) 我在我的 VC++ 项目中使用 1.5.4-all (2014-10-22)(适用于 x86 平台的 Microsoft Visual C++ 编译器 18.00.21005.1)。 我
我有一个 python 文件:analysis.py: def svm_analyze_AHE(file_name): # obtain abp file testdata = pd.
这个问题已经有答案了: How to serialize SqlAlchemy result to JSON? (37 个回答) 已关闭 4 年前。 我正在编写小查询来从 mysql 获取数据数据库,
我是 Python 初学者,我在 JSON 方面遇到了一些问题。在我正在使用的教程中有两个函数: def read_json(filename): data = [] if os.pa
我目前正在开发一个针对 iPad 的基于 HTML5 Canvas/JavaScript 的小型绘图应用程序。它在 Safari 中运行。到目前为止,除了一件事之外,一切都进展顺利。 如果我旋转设备,
以下代码无法使用 Visual Studio 2013 编译: #include struct X { X() = default; X(const X&) = delete;
嗨,我制作了一个文本分类分类器,我在其中使用了它,它返回一个数组,我想返回 jsonresponse,但最后一行代码给我错误 'array(['cycling'], dtype =object) 不可
我使用 Flask 和 Flask-Login 进行用户身份验证。 Flask-Sqlalchemy 将这些模型存储在 sqlite 数据库中: ROLE_USER = 0 ROLE_ADMIN =
如果您尝试发送不可 JSON 序列化的对象(列表、字典、整数等以外的任何对象),您会收到以下错误消息: "errorMessage": "Object of type set is not JSON
我在尝试 move std::vector 时遇到崩溃其中 T显然是不可 move 的(没有定义 move 构造函数/赋值运算符,它包含内部指针) 但为什么 vector 的 move 函数要调用 T
我尝试在用户成功登录后将 token 返回给他们,但不断收到以下错误: 类型错误:“字节”类型的对象不可 JSON 序列化 我该如何解决这个问题?这是我到目前为止的代码: if user:
我是一名优秀的程序员,十分优秀!