小编Bil*_*nch的帖子

Spirit无法将属性赋给单元素结构(或融合序列)

我的目标是让我的qi::grammar返回属性.spirit::lexer尽管如此,我在这方面遇到了很大的困难.

我希望用下面给定的语法,如果我用它来调用它spirit::qi::parse(begin, end, grammar, output);,struct ident output它将具有解析的lexeme的内容.

该错误似乎主要流出这一行: start %= lexer.identifier;

系统说明

  • 提升1.47.0
  • Mac OS X 10.7.2
  • clang ++或g ++(下面显示的错误来自clang ++)

编译命令

g++ -g -c -O0 -Wall -DBOOST_SPIRIT_DEBUG -DBOOST_SPIRIT_LEXERTL_DEBUG -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SPIRIT_ACTIONS_ALLOW_ATTR_COMPAT reduced.cpp
Run Code Online (Sandbox Code Playgroud)

源代码

#include <boost/fusion/include/adapt_struct.hpp>

#include <boost/spirit/home/lex.hpp>
#include <boost/spirit/home/lex/lexer/lexertl/lexer.hpp>
#include <boost/spirit/home/qi.hpp>

namespace spirit = boost::spirit;

struct ident {
    std::string value;
};

BOOST_FUSION_ADAPT_STRUCT(ident,
        (std::string, value)
        )

struct my_lexer : spirit::lex::lexer< spirit::lex::lexertl::actor_lexer<> > {
    spirit::lex::token_def<std::string> identifier;
};

struct my_grammar : spirit::qi::grammar<my_lexer::iterator_type, ident()> {
    my_grammar(const …
Run Code Online (Sandbox Code Playgroud)

c++ boost boost-spirit boost-spirit-qi

6
推荐指数
1
解决办法
1023
查看次数

在 Vim 中,如何删除某处重复的所有行

我有一个包含以下行的文件:

one one
one one
two two two
one one
three three
one one
three three
four
Run Code Online (Sandbox Code Playgroud)

我想从文件中删除所有出现的重复行,只保留非重复行。因此,在上面的示例中,结果应该是:

two two two
four
Run Code Online (Sandbox Code Playgroud)

我看到了这个类似问题的答案。我尝试修改前一行,如下所示:

:syn clear Repeat | g/^\(.*\)\n\ze\%(.*\n\)*\1$/exe 'syn match Repeat "^' . escape(getline ('.'), '".\^$*[]') . '$"' | d
Run Code Online (Sandbox Code Playgroud)

但它不会删除所有出现的重复行,它仅删除一些出现的重复行。

我怎样才能在 vim 中做到这一点?或者具体来说我怎样才能在 vim 中使用 ex 做到这一点?

澄清一下,我不是在寻找sort u.

vim ex

6
推荐指数
2
解决办法
4383
查看次数

编译时间间隔检查器

我找不到编译时间隔检查器,所以我尝试了一些开发自己的方法,你应该输入有问题的值,最小值和最大值,这样如果有问题的值,检查器将返回true在两个端点之间.

我的第一种方法是能够比较整数,它看起来像这样:

template<int Val, int LoEnd, int HiEnd>
struct is_in_interval : public std::integral_constant<bool, Val >= LoEnd && Val <= HiEnd>::type
{};
Run Code Online (Sandbox Code Playgroud)

对函数的调用看起来像

bool inside = is_in_interval<3, 1, 10>::value;
Run Code Online (Sandbox Code Playgroud)

这似乎有效.如果低端高于高端,我甚至可以在编译时使其失败:

template<int val, int LoEnd, int HiEnd>
struct is_in_interval : public std::integral_constant< typename std::enable_if<LoEnd <= HiEnd, bool>::type, val >= LoEnd && val <= HiEnd>::type
{};
Run Code Online (Sandbox Code Playgroud)

为了能够比较我想出的任何价值:

template<typename T>
struct is_in
{
    template<T val, T LoEnd, T HiEnd>
    struct closed_interval : public std::integral_constant< typename std::enable_if<LoEnd <= HiEnd, bool>::type, val >= LoEnd && val …
Run Code Online (Sandbox Code Playgroud)

c++ templates compile-time c++11

6
推荐指数
1
解决办法
269
查看次数

动态转换引用和自动

使用auto和dynamic_cast时,我遇到了一个非常奇怪的行为.这是我有的课程:

class BaseInterface {
public:
    virtual void someMethod()=0;
};

class Derived:public BaseInterface {
public:
    virtual void someMethod1()=0;
    void someMethod()override;
};
Run Code Online (Sandbox Code Playgroud)

当然,有一些类实现了所有派生方法.

然后有第三个类看起来像这样:

class ThirdClass {
public:
    void demoMethod(BaseInterface&);
    void anotherMethod(Derived&);
};

void ThirdClass::demoMethod(BaseInterface& obj) {
    auto buffer=dynamic_cast<Derived&>(obj);
    anotherMethod(buffer);
}
Run Code Online (Sandbox Code Playgroud)

当我用gcc编译它时,我得到一个"无法分配抽象类型的对象"错误.而当我更换

auto buffer=...
Run Code Online (Sandbox Code Playgroud)

Derived& buffer=...
Run Code Online (Sandbox Code Playgroud)

一切都很好.为什么会这样?自动没有推断出正确的类型或什么?

我还发现了一个仍然使用auto的肮脏技巧:

void ThirdClass::demoMethod(Base& obj) {
    auto buffer=dynamic_cast<Derived*>(&obj);
    anotherMethod(*buffer);
}
Run Code Online (Sandbox Code Playgroud)

c++ dynamic-cast reference auto c++11

6
推荐指数
1
解决办法
1292
查看次数

复制boost :: shared_ptr

typedef boost::shared_ptr<SomeData> data_ptr;
data_ptr cached_ptr;   // class member 
bool someWork(data_ptr& passed_ptr)
{
  // must copy passed_ptr = cached_ptr under some conditions
  // without pointing at the same memory 
  // I saw somewhere that I should do 
  // passed_ptr.reset(new SomeData(???))
  // I don't have a "reset" on passed_ptr
}
Run Code Online (Sandbox Code Playgroud)

我查看了文档;

复制和转换构造函数

shared_ptr(shared_ptr const & r); // never throws
template<class Y> shared_ptr(shared_ptr<Y> const & r); // never throws
Requires: Y* should be convertible to T*.

Effects: If r is empty, constructs an …
Run Code Online (Sandbox Code Playgroud)

c++ boost shared-ptr

5
推荐指数
2
解决办法
1万
查看次数

我们可以在函数内声明函数吗?

#include <stdio.h>

int main()
{
   void foo();
   printf("1 ");
   foo();
}

void foo()
{
    printf("2 ");
}
Run Code Online (Sandbox Code Playgroud)

输出:

1 2
Run Code Online (Sandbox Code Playgroud)

如何在函数内部声明函数?这是否意味着foo()函数只能由main()调用?

c function

5
推荐指数
1
解决办法
3974
查看次数

在Windows 8下读取物理内存

我希望能够插入一个物理地址,并读取存储在该地址的数据.

在Linux下,我会/dev/mem用来获取这些数据.在Windows 8下,我不确定有什么机制可以做到这一点.

我的用例是检查PCI Express设备.PCI Express设备在已知地址创建环形缓冲区,我可以从PCIe BAR确定.设置此地址后,在计算机重新启动之前不会更改.

目前,我可以使用像RW Everything这样的应用程序来查看那里的数据,但我希望能够在没有用户交互的情况下(没有GUI)这样做,这样我在访问数据之前就可以减少环形缓冲区包装的问题. .

有没有人知道我是否可以从用户空间(例如mmap一个区域)进行特权Windows系统调用,或者我是否需要使用自定义内核模块来执行此操作?我想有一些方法可以在没有自定义内核模块的情况下完成它,因为我不相信我在安装RW Everything时安装了一个.

windows

5
推荐指数
1
解决办法
2424
查看次数

为什么这个简单的线程代码失败了?

我试图让它做到我不能从循环中调用线程.但是当我运行它时,我得到一个运行时错误:

terminate called after throwing an instance of 'std::system_error'
what(): Invalid argument Thread #1

#include <iostream>
#include <vector>
#include <memory>
#include <thread>
#include <mutex>

std::mutex m;
static int thread_count;

auto foo = [&] {
    std::lock_guard<std::mutex> lock(m);
    std::cout << "Thread #" << ++thread_count << std::endl;
};

int main()
{
    std::vector<std::shared_ptr<std::thread>>
             threads(20, std::make_shared<std::thread>(foo));

    for (const auto& th : threads)
        th->join();
}
Run Code Online (Sandbox Code Playgroud)

c++ multithreading stl c++11

5
推荐指数
1
解决办法
4905
查看次数

为什么在使用scanf输入值时在%d和%c之间放置空格

我是C的初学者,我正在编写一个代码来打印用户输入字符的正方形.

通常当我们需要输入两个整数(比如x和y)时scanf() 我们写这个scanf("%d%d", &x, &y)但是根据我的代码的需要我应该输入一个整数(比如m)和一个字符(比如ch).

我把它写成了scanf("%d%c", &x, &ch)但它有一个错误,当我执行程序时它只要求输入积分值然后它就会停止执行.

我搜索了这一点,我发现我需要把间距%d%c作为scanf("%d %c", &x, &ch);

任何人都可以解释为什么我们需要在这之间留出空间吗?

c

5
推荐指数
1
解决办法
1003
查看次数

无指针继承

假设我有一个具有单个抽象虚函数的类,如下所示:

class MyClass{
  public:
    virtual void MyFunc() = 0;
};
Run Code Online (Sandbox Code Playgroud)

我没有其他功能,也没有数据成员。我还可以保证所有继承自 this 的类都没有任何数据成员,并且除了MyFunc.

强迫你拥有一个指向抽象对象的指针的最大原因(至少在我看来)是实现的大小是未知的......所以有没有办法而不是让一个指向这个类的指针只给出一个类的实例(或伪实例)。以这个为例:

void AFunction(MyFunc inst){  //Note the lack of pointer
  inst.MyFunc();  //This should call the implementation
}
Run Code Online (Sandbox Code Playgroud)

那么这是可能的还是我只是一个一厢情愿的思想家?

c++ inheritance pointers

5
推荐指数
1
解决办法
1889
查看次数