- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
为了熟悉 Boost.Proto,我正在尝试通过改编用户指南中的 TArray 示例,为固定但任意大小的浮点 vector 构建另一个表达式模板库。我做的第一件事是定义我的 vector 类:
typedef double real;
// Forward-declare an expression wrapper
template<typename Expr>
struct vector_expr_wrapper; // line 13
class FPVector : vector_expr_wrapper< proto::terminal< FPVector >::type > { // line 16
public:
FPVector() : numElements(0), elements(0) {}
FPVector(size_t n) : numElements(n), elements(new real[n]) {}
~FPVector() { delete[] elements; }
real& operator[](size_t i) { return elements[i]; }
template<typename Expr>
FPVector const& operator=(vector_expr_wrapper<Expr> vec_expr) {
for(size_t i=0; i<numElements; i++) {
elements[i] = vec_expr[i];
}
return *this;
}
private:
size_t numElements;
real * elements;
};
vector_expr_wrapper
还重载了它的 operator[]
以使用派生自 proto::callable_context
的 vector_context
评估自身为 FPVector
终端返回 vector[index]
。
当我编译代码并使用非常简单的语句 (a = b + c;
) 调用它时,我收到错误消息:
../main.cpp:16:18: error: invalid use of incomplete type ‘struct vector_expr_wrapper<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<FPVector>, 0l> >’
../main.cpp:13:8: error: declaration of ‘struct vector_expr_wrapper<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<FPVector>, 0l> >’
../main.cpp: In function ‘int main()’:
../main.cpp:121:8: error: no match for ‘operator+’ in ‘b + c’
然后 g++ 列出了可能的候选内容...我从中了解到,我必须在定义 FPVector
之前给出 vector_expr_wrapper
的完整定义,但我不能这样做,因为 vector_expr_wrapper
中的所有其他内容取决于 FPVector
(语法、评估上下文...)
我该如何解决这个问题(即我应该如何布局我的类(class))?
TArray 示例规避了这个问题——我猜——通过在很晚的时候定义它们的数组类并在之前用 int[3]
指定它的类型,我认为我无法在我的上下文中重现.
非常感谢您的帮助!
最佳答案
这是我的解决方案:
#include <vector>
#include <iostream>
#include <boost/proto/proto.hpp>
#include <boost/format.hpp>
namespace proto = boost::proto;
using proto::_;
typedef double real;
struct vector_grammar
: proto::or_<
proto::terminal< std::vector<real> >
, proto::plus< vector_grammar, vector_grammar >
, proto::minus< vector_grammar, vector_grammar >
, proto::multiplies< vector_grammar, vector_grammar >
, proto::divides< vector_grammar, vector_grammar >
>
{};
template<typename Expr>
struct vector_expr;
// Tell proto that in the vector_domain, all
// expressions should be wrapped in vector_expr<> and
// must conform to the vector_grammar
struct vector_domain
: proto::domain<
// use_basic_expr here instructs proto to use the stripped-
// down proto::basic_expr instead of proto::expr to reduce
// compile times. It's not necessary.
proto::use_basic_expr<proto::pod_generator<vector_expr> >
, vector_grammar
>
{};
struct vector_subscript_context
: proto::callable_context< vector_subscript_context const >
{
typedef real result_type;
explicit vector_subscript_context(std::ptrdiff_t i)
: i_(i)
{}
// Index array terminals with our subscript. Everything
// else will be handled by the default evaluation context.
real operator ()(proto::tag::terminal, std::vector<real> const &data) const
{
return data[this->i_];
}
private:
std::ptrdiff_t i_;
};
// Forward-declare an expression wrapper
template<typename Expr>
struct vector_expr
{
BOOST_PROTO_BASIC_EXTENDS(Expr, vector_expr<Expr>, vector_domain)
// Use the vector_subscript_context to implement subscripting
// of a vector_expr expression tree.
real operator []( std::ptrdiff_t i ) const
{
vector_subscript_context const ctx(i);
return proto::eval(*this, ctx);
}
};
template<typename = proto::is_proto_expr>
struct FPVector_
: vector_expr<
proto::basic_expr<
proto::tag::terminal
, proto::term< std::vector<real> >
>
>
{
explicit FPVector_(std::size_t n = 0)
{
proto::value(*this).resize(n);
}
real & operator[](std::ptrdiff_t i)
{
return proto::value(*this)[i];
}
real const & operator[](std::ptrdiff_t i) const
{
return proto::value(*this)[i];
}
template<typename Expr>
FPVector_ & operator=(vector_expr<Expr> const & that)
{
std::ptrdiff_t const size =
static_cast<std::ptrdiff_t>(proto::value(*this).size());
for(std::ptrdiff_t i = 0; i < size; ++i)
proto::value(*this)[i] = that[i];
return *this;
}
};
typedef FPVector_<> FPVector;
int main()
{
FPVector a(3), b(3), c(3);
for(std::ptrdiff_t i = 0; i < 3; ++i)
b[i] = c[i] = i;
a = b + c;
std::cout
<< boost::format("a = {%d, %d, %d}") % a[0] %a[1] %a[2]
<< std::endl;
}
您显示的代码有很多问题:
// Forward-declare an expression wrapper
template<typename Expr>
struct vector_expr_wrapper; // line 13
class FPVector : vector_expr_wrapper< proto::terminal< FPVector >::type >
您不能从(具体)类(FPVector
)继承不完整的类模板(vector_expr_wrapper
)。此外,您的 FPVector
类型正试图包含其自身的拷贝。 proto::terminal
是对象类型的包装器。将其视为事物本身的替代品,但带有一些额外的 Proto 香料。然后从它继承或从它继承的东西是不会飞的。
我发布的代码中唯一真正的技巧是使用 proto::is_proto_expr
。这是一个让 ADL 启动查找 boost::proto
命名空间中定义的运算符重载的讨厌的 hack。 "The extends<> Expression Wrapper" section底部的警告中详细描述了这件事proto 的文档。
关于c++ - Boost.原型(prototype) : General class layout for an EDSL with custom terminal classes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18232109/
崩溃报告: *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[_UIConc
我的 Google Charts 信息中心有问题。目前一切正常,除了柱形图在 Y 轴上显示字符串而不是整数。 我发现 Google 图表页面上的文档很难理解,所以如果我的代码中有错误,或者如果有更简单
我在 VS 项目编译中收到警告。尽管编译成功,但我无法获得文件的输出。您知道如何设置上述每一项吗? 它是在谈论哪个命令和outfile文件?应该给出什么路径? //testlib.h #include
有问题的设置: 我知道: xcode构建 -parallelizeTargets -maximum-concurrent-test-device-destinations NUMBER -maximu
我开始学习 UML,并且有一个关于 Actor 泛化的问题: 假设我正在为某所大学的某种应用程序编写用例图。我已经确定有两个 Actor ;学生和老师。 现在,为了简单起见,假设要求相当简单(对我的问
我经常需要实现一个能够根据用户命令切换其行为的对象。例如,这可能是连接到 PC 并由用户通过 GUI 控制的类表示设备的情况。更一般地说,设备必须独立存在,有自己的操作调度。 由于我想从特定设备类中“
题目地址:https://leetcode-cn.com/problems/generalized-abbreviation/ 题目描述 Write a function to generate
我刚刚在我的程序中添加了一个 ui 搜索栏,每次我重新运行该程序时,我都会收到错误消息 -[一般] 与守护程序的连接无效尽管如此,我的应用程序仍能完美运行,而且我似乎无法分辨出哪里出了问题。 有谁知道
这可能是一个简单的问题,但我找不到解决方案。我有一个带有 PostDate 列的 Excel 电子表格,其值为:VLOOKUP(E2,upload!A:H,2,FALSE)它显示为日期。我将此电子表格
我一直在尝试学习使用 Isabelle 2016。虽然原则上我喜欢异步证明检查的想法,但我不喜欢 Isabelle/jEdit 的原因有很多,其中最严重的是它使用了太多内存(为了我)。 如果我能在 I
我想弄清楚如何修改单个产品选项,以便产品管理员可以从下拉列表中选择产品的状况,即新的/二手的。 以下是允许产品管理员手动输入产品条件的代码。 // Enabling and Displaying Fi
这很清楚 destruct H如果 H包含连词或析取。但我无法弄清楚它在一般情况下的作用。它做了一些奇怪的事情,特别是如果 H: a -> b . 一些例子: Lemma demo : forall
这是我项目的例子: [ https://codepen.io/adan96/pen/ExaRgOe][1] 如您所见,我的 html 代码中有三个按钮。每次刷新页面或一段时间后打开项目时,是否应单击第
我有一个方法想将一个自定义枚举类型的数组作为参数。 看起来像这样的东西: public void DoSomething(WhatDoIPutHere[] parameters) 我想将 Enum1[
我正在构建一个网站,用户可以在其中清点项目并向其应用各种属性,例如。照片、网址、评论等。 我有一个包含三个表的数据库结构: users , entries , associations . 这些表具有
我正在寻找有关构建程序的最佳方式的建议。这是我现在所拥有的,以及我在设计中看到的问题: 我有一个带有私有(private)构造函数和 submit() 方法的类,用于仔细控制创建的对象,并将创建的每个
假设我有一个 4 维张量 A,我想按以下方式将它与 3 维张量 B 相乘: C[i,k,a,b] = sum_{j,l} A[i,j,k,l]*B[a,j,b,l] 这是矩阵乘法的推广: z[i,k]
我试图理解最坏情况分析,想知道在最坏情况运行时间分析中使用时是否有某种方式可以解释术语广义示例? 我的第一个想法是它是根据输入的特征来分析性能,但我觉得应该有更正式的方式来解释它,也许使用顺序符号?
NXN 矩阵中的“广义对角线”是 N 个单元格的选择,这样: 从每一行和每一列中只选择一个单元格 每个选定的单元格都包含一个非零值 我正在寻找一种算法来在 O(n^3) 中找到广义对角线。在我看来,以
Realm 新手,我想知道如何使用 RealmSwift 构建树结构... 我倾向于认为这是对文件系统文件夹概念的模仿,所以, class Folder: Object { dynamic v
我是一名优秀的程序员,十分优秀!