- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
这是一篇很长的文章,所以我想在顶部写一个唯一的问题:
看来我需要为本身不使用分配器的自定义容器实现“分配器扩展的”构造函数,而是将其传播到其内部实现,该内部实现是变量类型,并且其允许的类型可以是类似于std::的容器:映射,而且是不需要分配器的类型,例如 bool(boolean) 值。
一个人,我不知道如何实现这一目标。
非常感谢您的帮助! ;)
“自定义容器”是一个类模板value
,它是JSON数据结构表示形式的实现。
类模板value
是围绕有区别的联合的薄包装:类模板variant
(类似于boost变体)。此变体的允许类型表示JSON类型,对象,数组,字符串,数字 bool(boolean) 值和空值。
类模板value
具有可变参数模板模板参数包Policies
,该参数包基本定义了如何实现JSON类型。默认情况下,JSON类型通过std::map
(对于Object),std::vector
(对于Array),std::string(对于JSON数据字符串)和一些表示其余JSON类型的自定义类实现。value
中定义的类型机器用于根据给定的Policies
和value
本身为容器类型创建递归类型定义。 (例如,当变体类使用std::map或std::vector时,不需要使用“递归包装器”来实现JSON容器)。也就是说,此类型机制会创建用于表示JSON类型的实际类型,例如Array的std::vector
,其value_type
等于value
; Object的std::map
,对象的mapped_type
等于value
。 (是的,在生成类型时,value
实际上是不完整的)。
类模板value
基本上如下所示(已大大简化):
template <template <typename, typename> class... Policies>
class value
{
typedef json::Null null_type;
typedef json::Boolean boolean_type;
typedef typename <typegenerator>::type float_number_type;
typedef typename <typegenerator>::type integral_number_type;
typedef typename <typegenerator>::type string_type;
typedef typename <typegenerator>::type object_type;
typedef typename <typegenerator>::type array_type;
typedef variant<
null_type
, boolean_type
, float_number_type
, integral_number_type
, string_type
, object_type
, array_type
> variant_type;
public:
...
private:
variant_type value_;
};
value
实现了通常的可疑行为,例如构造函数,赋值,访问器,比较器等。它还实现转发构造函数,以便可以使用参数列表构造变体的某种实现类型。
std::vector<value, std::allocator<value>>
并且object_type变为
std::map<std::string, value, std::less<std::string>, std::allocator<std::pair<const std::string, value>>>
value
。例如,一个竞技场分配器。
value
的模板参数,如下所示:
template <
typename A = std::allocator<void>,
template <typename, typename> class... Policies
>
class value ...
A
不是
value
的allocator_type,而是仅在类型机器中使用,以生成适当的实现类型。也就是说,在
allocator_type
中没有嵌入的
value
-但这会影响实现类型的allocator_type。
id
(一个整数)。它不能是默认构造的。
typedef test::custom_allocator<void> allocator_t;
typedef json::value<allocator_t> Value;
typedef typename Value::string_type String;
typedef Value::array_type Array;
allocator_t a1(1);
allocator_t a2(2);
// Create an Array using allocator a1:
Array array1(a1);
EXPECT_EQ(a1, array1.get_allocator());
// Create a value whose impl-type is a String which uses allocator a2:
Value v1("abc",a2);
// Insert via copy-ctor:
array1.push_back(v1);
// We expect, array1 used allocator a1 in order to construct internal copy of value v1 (containing a string):
EXPECT_EQ(a1, array1.back().get<String>().get_allocator());
--> FAILS !!
value
),第二个参数是分配器类型。 “策略”定义了如何根据值类型和分配器类型实现JSON类型(例如Array)。
template <typename Value, typename Allocator>
struct default_array_policy : array_tag
{
private:
typedef Value value_type;
typedef typename Allocator::template rebind<value_type>::other value_type_allocator;
typedef GetScopedAllocator<value_type_allocator> allocator_type;
public:
typedef std::vector<value_type, allocator_type> type;
};
GetScopedAllocator
定义为:
template <typename Allocator>
using GetScopedAllocator = typename std::conditional<
std::is_empty<Allocator>::value,
Allocator,
std::scoped_allocator_adaptor<Allocator>
>::type;
最佳答案
决定是否将分配器传递给子元素的逻辑在标准中称为uses-allocator构造,请参见20.6.7 [allocator.uses]。
有两个使用uses-allocator协议(protocol)的标准组件:std::tuple
和std::scoped_allocator_adaptor
,您还可以编写用户定义的分配器(但是使用scoped_allocator_adaptor
向现有分配器添加对该协议(protocol)的支持通常会更容易。)
如果要在scoped_allocator_adaptor
中内部使用value
,则要使作用域分配器起作用,您需要做的所有工作就是确保value
支持std::uses_allocator<value, Alloc>
特性指定的uses-allocator构造。如果定义了value::allocator_type
且std::is_convertible<value::allocator_type, Alloc>
为true,则该特征将自动为true。如果value::allocator_type
不存在,则可以将特征特化为true(这是std::promise
和std::packaged_task
的作用):
namespace std
{
template<typename A, typename... P, typename A2>
struct uses_allocator<value<A, P...>, A2>
: is_convertible<A, A2>
{ };
}
value
由支持uses-allocator构造的类型构造时,它将尝试将分配器传递给
value
构造函数,因此,您还需要添加allocator-extended构造函数以便可以传递它。
// Insert via copy-ctor:
array1.push_back(v1);
custom_allocator
模板必须支持uses-allocator构造,或者您必须将其包装起来,以便
Value::array_type::allocator_type
是
scoped_allocator_adaptor<custom_allocator<Value>>
,从您的问题中我无法确定这是否正确。
std::vector
中支持它。对于GCC 4.8,我也为
forward_list
添加了支持。我希望其余的容器将全部用于GCC 4.9。
std::allocator_traits
,而不是直接在分配器类型上调用成员函数。
Yes, value is actually incomplete at this moment when the types are generated
关于c++ - 如何为范围分配器模型启用自定义容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15359927/
我想知道如何首先检测 Javascript 是否启用/禁用。在此站点上禁用 javascript 表明 stackoverflow 使用了称为标签的东西。 这是标准的做法吗?它适用于所有浏览器吗?它不
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: How to enable PHP short tags ? Enable short open tags
在 VSTS (Azure DevOps) 上拥有私有(private)存储库我尝试通过将以下内容添加到 .csproj 文件来启用 SourceLink:https://github.com/dot
我创建了一个 wx.Frame(我们称之为 mainFrame)。该框架上包含一个按钮,当单击该按钮时,会创建一个新框架(我们称之为 childFrame)。 我想知道如何在创建 childFrame
当我禁用 WPF 中的控件时,比如说一个菜单项 MenuItem aMenuItem = ... aMenuItem.IsEnabled = false; MenuItem 中的文本仍然处于事件状态,
我想在我的 nginx 服务器上启用 gzip 压缩。 nginx.conf 文件在这里: http { # Enable Gzip server { location ~* \.(?
我正在使用免费的 heroku 附加 PG 备份并遵循这些 instructions .我找到了安装应用程序的命令:heroku addons:add pgbackups:auto-week。但是我想
我想知道脚本是否可以使用某种切换按钮启用/禁用页面上的所有输入元素。 我用谷歌搜索了它,但除了这个之外没有发现任何有用的东西: http://www.codetoad.com/javascript/e
在我的 php 文件中,我想使用 jQuery Datepicker。 当我的文件加载时,我创建了禁用的日期选择器。 然后,当我的 php 文件(它是一个表单)中的一个特殊字段被填充时,我想启用日期选
我有一个按钮,如下所示: RadButton lnkAdd = new RadButton(); lnkAdd.ID = "BtnAdd"; lnkAdd.CommandName = RadGrid.
public static void ToggleTaskManager(string keyValue) { RegistryKey objRegistryK
我正在 Azure 中使用事件网格订阅,该订阅在创建 Blob 时触发。然而,我们有很多文件进入这个 blob,比如说 1000 多个。 如果我发现任何文件有任何错误,我想做的是禁用事件订阅。 最佳答
我的网站上有几个使用 HTML5 contentEditable 属性的 div。目标是让用户能够开始编写日记条目,并将保存按钮从禁用更改为启用。 这是我目前拥有的 HTML: Write
我有一个范围输入,其定义如下: @Html.LabelFor(m => Model.Quality, Resources.CompressionQuality) 和一个下拉菜单: @Html.Lab
我正在尝试创建一个启用/禁用按钮的下拉菜单,并且我正在关注此 example 但它已经有 4 年历史了,而且该功能似乎无法在我的 xhtml 页面上运行。 任何帮助都将被适当 最佳答案 这是一个现场演
我正在 Azure 中使用事件网格订阅,该订阅在创建 Blob 时触发。然而,我们有很多文件进入这个 blob,比如说 1000 多个。 如果我发现任何文件有任何错误,我想做的是禁用事件订阅。 最佳答
我在这里遇到一个非常奇怪的情况:我编写了一个应用程序,除其他外,将连接的代理从打开切换到关闭,反之亦然。通过更改注册表中的值来完成此操作: public void SetUpProxy(string
我需要调整一堆 PVC 的大小。似乎最简单的方法是通过ExpandPersistentVolumes 功能。但是我无法获得配置合作。 ExpandPersistentVolumes feature g
如果我的TextField为空,则应禁用该按钮,并且该按钮的textColor和borderColor应该为灰色。但是,启用按钮后,颜色应为蓝色。 更改textColor很容易: button.Set
您好,我的问题是:我无法从另一个类启用表单的按钮。我的表单类是 public class FileSending { //Function for enabling the button
我是一名优秀的程序员,十分优秀!