问题标签 [expression-templates]
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.
c++ - 为什么这个 Blitz++ 代码不能编译?
我是闪电战++新手。到目前为止,一切都很好,但我有点困惑为什么下面代码中的注释行无法编译
我在 Debian/Lenny (g++ 4.3.2, Blitz 0.9)。这是代码:
我确实喜欢被约束,所以很高兴知道是否有办法让它工作(到目前为止,Blitz++ 的经验表明,这可能只是选择正确的包括... )。
c++ - 使用表达式模板的中间结果
在 C++ 模板元编程中:来自 Boost 和 Beyond 的概念、工具和技术
...表达式模板的一个缺点是它们倾向于鼓励编写大而复杂的表达式,因为评估只会延迟到调用赋值运算符。如果程序员想要重用一些中间结果而不提前评估它,她可能会被迫声明一个复杂的类型,例如:
(或更糟)。请注意,这种类型不仅准确且冗余地反映了计算的结构,因此需要在公式更改时进行维护,而且还压倒了它?这是 C++ DSEL 长期存在的问题。通常的解决方法是使用类型擦除来捕获表达式,但在这种情况下,需要为动态调度付费。最近有很多讨论,由 Bjarne Stroustrup 本人带头,关于重用残留的 auto 关键字在变量声明中进行类型推导,以便将上述内容重写为:
这个特性对于 C++ DSEL 作者和用户来说将是一个巨大的优势......
是否有可能用当前的 c++ std. (非 C++0X)
例如,我想写一个表达式,如:
Expr X,Y
矩阵 A、B、C、D
X=A+B+C
Y=X+C
D:=X+Y
where operator := 在最迟时间计算表达式。
c++ - C++ 表达式模板教程和介绍
C++表达式模板系统的创建有哪些好的介绍?我想表达用户定义类型的算术,同时避免临时值(可能很大),并学习如何直接执行此操作而不是应用现有库。
我找到了Todd Veldhuizen 的原始论文和Josuttis C++ Templates book中的一个示例,以及Kreft & Langer的一篇文章。在Modern C++课程的第6讲中提到过,回溯到Josuttis。POOMA库背景很好地引入了表达式模板。
我正在寻找简单、清晰的说明。
c++ - std::vector 的表达式模板运算符重载问题
我目前正在开发一个使用表达式模板的数值库。不幸的是,我遇到了运算符重载的问题。考虑以下精简示例。
使用 gcc 4.4.3 或 clang 2.8 编译时会给出以下错误消息:
出于某种原因,编译器会查找测试命名空间并找到我的通用运算符。我将这种形式与一些特质魔法一起使用,以减少我必须为操作员制作的版本数量。它应该接受 4 种不同的数据类型(包括 double 和 int),这会导致很多不同的组合。
有没有办法在不为每个运算符拼出所有组合的情况下完成这项工作?
c++ - 表达式模板未完全内联
我已经完成了数学库的第一个版本,下一步我想转向表达式模板来提高代码的性能。但是,我最初的结果与我的预期不同。我在 MSVC 2010 中以 vanilla Release 模式编译(并且可以使用 C++0x)。
为我将向您展示的大量代码提前道歉,它是我能做到的尽可能少,同时让人们看看我在做什么。分析框架:
表达模板向量:
手动内联:
结果:
表达式模板:
总时间:14.172 平均时间:0.29525
分钟:0.281 最大:0.422手动内联:
总时间:8.438 平均时间:0.175792
分钟:0.171 最大:0.188
如您所见,表达式模板(显然)没有变成完全内联的代码。这是test()
最后一次调用的 ,的反汇编std::clock()
:
表达式模板组装:
手动内联组装:
结论:无论出于何种原因,MSVC2010 都不会内联调用operator+
. 有人知道这是为什么吗?即使 put __forceinline
(我想避免)也不会内联。
更新:正如jdv-Jan de Vaan 提到的,当我删除析构函数时:
它内联operator+
。奇怪的是,它将它内联到不同的程序集,我的测试表明这个输出虽然比我原来的性能好,但仍然没有达到与手动内联版本相同的状态。任何想法为什么会这样?
c++ - 连接 const_string 的
如何连接两个const_string
?它的主页http://conststring.sourceforge.net/说引用:
它还使用表达式模板进行连接,有效地消除了创建中间临时对象所产生的开销。
所以我认为它最简单的形式
应该管用。但是 gcc-4.6 抱怨 operator+。为什么?我必须投和a
吗?b
std::string
错误输出如下:
c++ - 使用表达式模板避免#define
使用以下代码,“hello2”不会显示,因为在第 3 行创建的临时字符串在第 4 行执行之前死亡。在第 1 行使用 #define 可以避免这个问题,但是有没有办法在不使用 #define 的情况下避免这个问题?(C++11 代码没问题)
澄清:
请注意,我相信 Boost uBLAS 存储引用,这就是我不想存储副本的原因。如果您建议我按值存储,请解释为什么 Boost uBLAS 是错误的,按值存储不会影响性能。
c++ - 模板函数的参数没有进行任何隐式转换
出于某种奇怪的原因,我无法将这段代码中的模板参数隐式转换为兼容类型。
失败:
因此,如果我是正确的,编译器应该会看到 main 函数中的代码如下:
((a + b) + c)
- 计算
a + b
- 使用转换运算符将
a + b
fromadd<...>
的结果转换为vec<float, 2>
add<...>
- 计算
(a + b) + c
但它从不进行隐式转换。如果我将 (a + b) 的结果显式转换为 vec,则代码可以正常工作。
c++ - 将 Boost.Proto 语法与类型匹配
我试图在 Boost.Proto 中创建一个匹配向量类型的语法,但是当我给它一个该类型的终端时,它与语法不匹配。类型定义如下所示:
我试图匹配的语法看起来像这样:
匹配失败:
如何制作与特定类型匹配的语法?
编辑:
似乎 proto::_ 和 proto::N 没有在自定义类型中用作通配符。该代码确实使用此语法编译(matches
断言通过):
但是当任一通配符属于以下类型时不起作用:
或者:
因此,如果我不能使用我自己的类型的通配符,我如何测试表达式是否是包含向量的终端?
c++ - C++11:防止对象被分配给引用
有没有办法创建A
这样的类型:
鉴于:
A f(...);
然后:
两者都auto&& a = f(...);
给出const auto& a = f(...);
编译错误?
这样做的原因是,在这种情况下,A
是一个表达式模板,其中包含对临时对象的引用(作为 的参数提供f
),所以我不希望这个对象的生命周期超出当前表达式。
请注意,我可以通过将s 复制构造函数设为私有并在需要时与 A 交朋友来防止auto a = f(...);
成为问题。A
f(...)
代码示例 (ideone链接):