问题标签 [template-mixins]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
templates - 如何编写一个策略友好的输入过滤器?
背景:
我们的软件使用多个 API 来执行文件 i/o:
FILE*
,CStdio
(和几个衍生产品)HANDLE
,,...
我为 编写了一个FilePointer
RAII 包装器FILE*
,它可以很好地替代所有现有的 C 代码。
较新的代码通常使用 CStdio 派生或包装类。
SimpleTextFile
最近,除了我们之前版本的 MBCS 之外,我还编写了一个来处理 UTF-16LE i/o。
这些不同类的接口是相似的,但并不完全相同。我想我可以使用策略模板类编写一些实用算法,以使实用算法适应各种文件类型。这有点成功,但是,我经常需要在实用程序算法中混合某种类型的 line-reader-filter。
这就是问题所在 - 如果我混合了带有过滤器的行阅读器,则传递给它的任何算法都不能再使用策略类来确定如何适应底层类型(因为R
现在a Wrapper<R>
,并且没有针对 a Wrapper<R>
) 的策略。
问题:
我如何制作可以为现有类型提供新行为的 mixin 模板类,同时仍然允许对基础类型起作用的各种策略继续工作?
详细信息:
策略模板:
StreamPositionPolicy<T>
- 提供适用于 T 的 GetPosition() 和 SetPosition()。
LineReaderPolicy<T>
- 提供一组通用接口,用于从 T 中读取一行。
FileNamePolicy<T>
- 为 T 提供 GetFilename()。
因此,如果 T 是 CStdio 派生类或 FILE*,上述将尽最大努力提供用于查找、读取行和检索原始文件名的通用接口。
此外,I Have:
FilteredStringReader<F,R>
将过滤器与读者结合在一起。以前,我这样做是:
这适用于任何使用 LineReaderPolicy<> 的算法,因为默认策略是尝试使用 ReadString() 接口,并且此接口与默认(通用)策略匹配,并且生活很好。
但是,如果将此对象传递给需要使用其他策略之一的算法之一 - 例如StreamPositionPolicy<FilteredStringReader<F,R>>
,那么这个方案就会失败!a 没有StreamPositionPolicy<>
a FilteredStringReader<>
, aFilteredStringReader<>
不适合默认StreamPositionPolicy<>
(它只提供 line reader 接口,不提供流接口或 name 接口等)
所以,我在想这样的 mixin 可能应该使用 CRTP,并从其底层文件类型/阅读器类型派生。然后,它将是其中之一,任何具有基础读者专业化的策略类都会成功。
但这带来了生命周期/所有权/复制问题:
令人惊讶的是,这种工作 - 构造这个策略对象是可能的......但它复制了阅读器实例(这可能不是一个伟大的想法,取决于阅读器的实现 - 或者更有可能 - 某些阅读器类型根本就赢了' t 允许复制)。
我只想要我的阅读器对象的一个实例——一个由 mixin 模板实例包装的实例,仅此而已。
所以,我觉得这是走错路了。
我可以使用可变参数模板并可能使用完美转发来让我的 mixin 构造本身 + 它的基础就地。但这失去了前一个化身的一些功能:显示的原始版本FilteredStringReader<F,R>
可以分层在阅读器之上,使用,然后丢弃,而阅读器本身的生命周期继续(或者为了另一个算法的目的被更深地包装)。
因此,使用 CRTP 似乎不太合适。但是我又回到了最初的问题,即如何为类型 R 制作包装器,它只拦截一个接口,而让所有其他接口不理会?
d - 混入 D 中的每个非抽象子类
我已经创建了一个框架,每个派生的类Action
都需要有一些神奇的特性,比如依赖于这个类字段的静态方法等。
我正在使用 amixin template
来实现这一点:
这工作并且正在做我需要的,但是它并不完全干燥,因为我必须包含mixin ACTION!(Subclass);
在每个非抽象子类中。没有任何情况下我想要一个没有这个 mixin 的子类。
所以通常我最终得到了来自 C++/Qt 的 Q_OBJECT 宏。
由于 D lang 称赞自己非常动态,也许有一种方法可以避免这种重复并将这个模板自动混合到每个子类中?
所以我的代码做同样的事情可能看起来像:
c++ - Mixin 是基于策略设计的特例吗?
据我所知,mixin是先写派生类,然后可以通过模板参数将基类注入进去。
示例:http ://www.drdobbs.com/cpp/mixin-based-programming-in-c/184404445
据我所知,基于策略的设计也是如此。 http://en.wikipedia.org/wiki/Policy-based_design
它并不是说你应该从它派生,你也可以通过其他方式使用模板参数。但是,例如在 Wikipedia 基于策略的设计示例中是这样的:
我认为这与mixin相同。(相反,在 mixins 中你通常使用公共继承)
它们之间是否有任何显着差异,或者 mixin 是基于策略的设计的一个特例?
c++ - 带有可变参数模板的 mixin 继承的可见性规则
考虑我从可变参数模板继承整个参数列表。论据是如何继承的?
我试过了,似乎所有 R
的都是继承的 public(不仅仅是第一个)。这是定义的行为吗?
我使用 gcc 和 msvc 进行了尝试(感谢jaggedSpire也使用了 clang),结果都相同。编译器甚至没有提到任何警告。您可以在此处查看一个正在运行的示例。
c++ - 对软件事务内存友好的通用组件
假设我们编写了一些可以同时使用或不使用的新类。显然,我们不希望锁定所有内容,因为它们可能会被同时调用。解决此问题的一种方法是通过指定锁定的mixins进行参数化:
并Locking
使用实际上为多线程情况锁定的类和对另一种情况不执行任何操作的类进行实例化(希望编译器甚至会优化调用)。
现在假设我想用软件事务内存而不是锁定来做到这一点。查看N3919(或gcc 前体),想法不同。没有电话,例如
取而代之的是函数说明符,例如
和块说明符,如
后者调用前者的严格规则,并且看起来没有任何东西可以被mixins使用。
如何做到这一点(不涉及预处理器)?另请注意,STM 的主要优点之一是可组合性,但似乎没有办法让实例化来反映它bar
是可交易的。
pug - 使用 pug mixin 结果作为属性值
这是我要完成的内容的简化版本:
我希望将锚标记编译为<a href="baz.html">test</a>
,但我得到的是类型错误,而foo
不是函数。虽然我确实看到它在技术上不是一个函数,但这不是一个 mixin 有用的场景吗?我在 pug 文档中搜索了与我类似的用例场景,但没有成功。
使用mixins可以实现我在这里实现的目标吗?或者这只有通过作为上下文变量传递的常规 JS 函数才有可能?
d - 使用 mixins 时模板类型参数的模块间符号解析错误
在
我已经实现了一个轻量级多态数组容器,我称之为VariantArrays(Types...)
由我调用的相应多态索引索引VariantIndex(Types...)
。
它.mangleof
与 mixins 一起使用来自动推断Types
. 元素类型在模板参数中传递Types
给上面提到的两个模板结构。
一切正常,除了当我尝试VariantArrays
从variant_arrays.d
. 例如,如果我尝试在另一个包含
我得到错误
换句话说,即使它是作为模板参数提供的S
,也无法在范围内解析符号。VariantArrays
有没有办法解决这个问题?
也在这里发布:http: //forum.dlang.org/post/einvuqvpeoeubkwhwbbm@forum.dlang.org
以下是variant_arrays.d
(不包括单元测试)的定义:
c++ - 根据参数数量调用mixin基类的构造函数
我有两组遵循以下模式的 mixin 基类
从这些基类中,我派生了两组 mixin 类
我现在面临的问题是,我想将遵循 OneArgBase 模式的类传递给 TwoArgMix
但不知道两个如何编写 TwoArgMix 的构造函数,如果只将第一个模板参数传递给遵循 OneArgMix 模式的 Mixin 基类。如果可能的话,我想避免向 OneArgMix 构造函数写入虚拟参数,因为 OneArgMix 也需要这些类。
c++ - 将类(mixin)的功能与模棱两可的调用结合起来
我正在阅读 C++ 中的“mixin”技术,但有一些我不明白的东西,似乎是语言的一个限制,由于编译器的歧义(和标准拒绝解决,甚至如果可以的话)。
mixin 的想法是聚合来自不同部分的能力。有时可以用相同的名称调用这些功能,因为它们通常做同样的事情。
我可以将这两个类的服务与
但是,当我使用它时,我得到一个编译错误:“对成员 'f' 的请求不明确”(godbolt 链接)。
因此,编译器知道f
存在,但它拒绝解析哪个是正确的调用。它会生成此错误:
当然,我可以更改课程并使用这个成语“带来完整的f
重载版本”。
它有效,但问题是CombineAB
不能通用。最接近的是:
但我不能不添加 的等价物using T1::f; using T2::f
,首先因为combination
需要了解 T1、T2 中所有可能的功能。
因此,似乎需要根据具体情况定义组合。例如与
这违背了目的,因为如果 T1 和 T2 提供 20 个具有相同名称的函数(如我的情况),则该类将需要重复所有这些函数名称。最糟糕的是,它不能通过额外的模板参数来完成(可以吗?)。
这是在 C++ 中组合类的正确方法吗?是否有解决方法,或者这只是对问题的过于幼稚的看法?如有必要,我愿意接受涉及大量模板代码的选项。
即使实例化不是等式的一部分并且f
是静态函数,问题仍然存在。似乎该语言对更改或组合基类中成员函数的含义有强烈的感觉。