小编mmo*_*cny的帖子

Boost的最佳文档:asio?

boost网站上提供的文档是有限的.

从我能够阅读的内容来看,普遍的共识是很难在boost :: asio库上找到好的文档.

这是真的吗?如果是这样,为什么?

笔记:

  • 我已经找到了(非增强型)Asio网站 - 文档看起来与boost网站上的相同.
  • 我知道Boost :: asio是新的!我正在寻找解决方案而不是借口.

编辑:

  • 有人建议将网络库添加到由Boost:asio(Christopher Kohlhoff)的作者编写的TR2标准库中.虽然它不是boost:asio的文档,但它确实将它作为TR2提案的基础.由于作者在本文档中付出了更多努力,我发现它有点帮助,如果不是作为参考,那么至少作为概述.

c++ boost boost-asio

139
推荐指数
7
解决办法
6万
查看次数

为什么'mutable'是一个lambda函数属性,而不是一个捕获类型?

为什么c ++ 11要求我们编写:

[a,b]() mutable { a=7; } // b is needlessly mutable, potential source of bugs
Run Code Online (Sandbox Code Playgroud)

代替:

[mutable a,b]() { a=7; } // no problems here
Run Code Online (Sandbox Code Playgroud)

这是一种疏忽,被认为不够重要,还是有特定的技术原因?

c++ c++11

41
推荐指数
3
解决办法
3516
查看次数

来自两个派生类的多重继承

我有一个抽象的基类作为接口.

我有两个派生类的"集合",它们实现了抽象类的一半.(一个"set"定义与初始化相关的抽象虚拟方法,另一个"set"定义与实际"工作"相关的那些.)

然后,我得到了使用多继承来构造完全定义的类的派生类(并且本身不添加任何东西).

所以:(坏伪代码)

class AbsBase {
  virtual void init() = 0;
  virtual void work() = 0;
}

class AbsInit : public AbsBase {
  void init() { do_this(); }
  // work() still abs
}

class AbsWork : public AbsBase {
  void work() { do_this(); }
  // init() still abs
}

class NotAbsTotal : public AbsInit, public AbsWork {
  // Nothing, both should be defined
}
Run Code Online (Sandbox Code Playgroud)

首先,我可以这样做吗?我可以继承两个派生自同一Base的类吗?(希望如此).

虽然这是"真正的问题"(我在上面撒谎以简化示例).

我真正做的是将非抽象访问器方法添加到基类:

class AbsBase {
public:
  void init() { init_impl(); }
  void work() { …
Run Code Online (Sandbox Code Playgroud)

c++ inheritance multiple-inheritance

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

杀死一个被阻止的Boost :: Thread

我正在编写一个阻止两个输入的应用程序istreams.

从两者中读取istream是同步(阻塞)调用,因此,我决定创建两个Boost::threads来进行读取.

这些线程中的任何一个都可以到达"结束"(基于接收的一些输入),并且一旦达到"结束",两个输入流都停止接收.不幸的是,我不知道哪个会这样做.

因此,我不能join()在两个线程上,因为只有一个线程(不能预定哪一个)将实际返回(解除阻塞).

我必须以某种方式强迫对方退出,但它被阻止等待输入,所以它本身不能决定是时候返回(条件变量或什么不是).

他们是一种方式:

  • 发送信号boost :: thread,或
  • 强迫istream"失败",或
  • 杀死Boost ::线程?

注意:

  • 其中之一istreams就是cin
  • 我正在尝试重新启动该过程,因此我无法以禁止重置它们的方式关闭输入流.

编辑:

  • 我知道什么时候到达"结束",我知道哪个线程已成功完成,哪些线程需要被杀死.它是我需要弄清楚的杀戮(或者从istream中读取的不同策略).
  • 我需要两个线程退出并正确清理:(

谢谢!

c++ iostream boost-thread

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

颜色正则表达式匹配 - 没有丢失未命中

使用时,grep --color=always我可以为正则表达式匹配获得漂亮的颜色突出显示.

但是,grep只返回至少有一个匹配的行.相反,我正在寻找一种方法来简单地突出正则表达式匹配,同时保留所有其他输入,而不丢弃没有任何匹配的行.

我试图使用颜色sed,并阅读grep文档,但我似乎无法得到我想要的.

如果我的描述不明显,我想要:

INPUT:

  • 弗雷德
  • 摊晒
  • 红色

正则表达式:

  • ".*红色"

OUTPUT:

  • 弗雷德(红色)
  • 摊晒
  • 红色(红色)

所以我可以这样做:

list_stuff | color_grep "make_this_stand_out_but_dont_hide_the_rest"
Run Code Online (Sandbox Code Playgroud)

编辑:

我找到了一个不太漂亮的解决方案,但它有效:

感谢:http: //www.pixelbeat.org/docs/terminal_colours/

特别是脚本(我修改/简化):http: //www.pixelbeat.org/talks/iitui/sedgrep

function sedgrep ()
{
    C_PATT=`echo -e '\033[33;01m'`
    C_NORM=`echo -e '\033[m'`

    sed -s "s/$1/${C_PATT}&${C_NORM}/gi"
}
Run Code Online (Sandbox Code Playgroud)

仍在寻找一种更简单的方法来做到这一点!

regex linux

19
推荐指数
3
解决办法
4525
查看次数

私人非常规和公共const成员职能 - 和平共处?

我正在尝试使用两个具有相同名称的方法创建一个类,用于访问私有成员.一种方法是public和const限定,另一种方法是private和non-const(由朋友类用于通过引用返回来修改成员).

不幸的是,我收到编译错误(使用g ++ 4.3):当使用非const对象来调用方法时,g ++抱怨我的方法的非const版本是私有的,即使存在公共(const)版本.

这看起来很奇怪,因为如果私有非const版本不存在,一切都编译得很好.

有没有办法让这项工作?它是否在其他编译器上编译?

谢谢.

例:

class A
{
public:
    A( int a = 0 ) : a_(a) {}
public:
    int   a() const { return a_; }
private:
    int & a()       { return a_; } /* Comment this out, everything works fine */
    friend class B;
private:
    int a_;
};


int main()
{
    A       a1;
    A const a2;

    cout << a1.a() << endl; /* not fine: tries to use the non-const (private) version of a() and fails …
Run Code Online (Sandbox Code Playgroud)

c++ compiler-errors

15
推荐指数
2
解决办法
2828
查看次数

创建与推导参数类型相同的局部变量的最简单方法是什么?

即:

[](auto const& foo) {
    ??? bar; // should be same base type as foo, minus const&
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,我正在使用:

typename std::remove_const<typename std::remove_reference<decltype(foo)>::type>::type combination
Run Code Online (Sandbox Code Playgroud)

但我真的希望这是一个更容易的选择!

c++ lambda auto c++11 argument-deduction

8
推荐指数
1
解决办法
219
查看次数

C++ 范围适配器/视图和迭代器失效规则

在修改底层容器时,我没有找到任何对 range/range-adaptor/range-view 特定失效规则的直接引用。

\n\n

直觉表明它与指针/迭代器失效规则完全相同——这些规则在标准的容器部分中指定。

\n\n

目前容器失效的措辞如下:

\n\n
\n

“...使引用序列中元素的所有引用、指针和迭代器以及尾后迭代器无效。”

\n
\n\n

这就提出了一个问题:所有范围是否都必须“引用序列的元素”,或者它们是否可以通过容器的接口访问元素?

\n\n

在我看来,大多数范围适配器已经访问了一个序列,而不直接引用该序列的元素(即惰性视图只是构建迭代器适配器)。

\n\n

可以这么说,似乎重要的是视图金字塔底部的基本范围。

\n\n
\n\n

我们都在某个时刻了解到,在迭代同一个向量时不能这样做std::vector::push_back,因为内存可能会移动并使迭代无效。但是,我们还了解到,您可以通过 push_back使用std::vector::operator[]访问权限,只要您仔细检查您的size()

\n\n

在我看来,相同的规则适用于范围/适配器/视图。

\n\n

那么:是否可以强制随机访问容器上的某些等效项std::ranges::views\xe2\x80\x8b::\xe2\x80\x8ball(或者也许是take_view)使用数组索引(或某些等效的间接/惰性元素访问),而不直接使用迭代?

\n\n
\n\n

允许这样做的东西:

\n\n
std::vector<People> people = ...;\nfor (auto& person : std::ranges::views::lazy_all(people)) { // or ranges::lazy_take_view(people, people.size())\n  if (person.has_new_child()) {\n    people.push_back(person.get_new_child());\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

c++ range c++20

8
推荐指数
1
解决办法
623
查看次数

如何轻松验证安装正确的npm依赖项?

npm install如果有任何未满足的package.json依赖项,我怎么知道何时提示用户运行?

我想这样做,因为如果任何require()失败,用户会得到一个糟糕的错误消息:

module.js:340
    throw err;
          ^
Error: Cannot find module 'nopt'
Run Code Online (Sandbox Code Playgroud)

我之前试图检查node_modules目录是否存在,但这只适用于新的git克隆.我也尝试过只需要npm和运行npm install作为负载的一部分,但这是非常重的.

我希望有一个较轻的重量库,只需解析package.json并确保node_modules内容满足要求.

一个想法是使用process.on('uncaughtException')仅捕获模块导入错误,但首先查看是否存在"标准"解决方案.

node.js npm

7
推荐指数
3
解决办法
1万
查看次数

非成员非朋友函数语法

他们是否可以使用与成员函数相同的"点"表示法在对象上使用非成员非友元函数?

我可以从一个类中拉出(任何)成员,并让用户以他们一直使用的方式使用它吗?

更长的解释:

Scott Meyers,Herb Sutter等人认为,非成员非朋友函数是对象接口的一部分,可以改进封装.我同意他们.

但是,在最近阅读本文之后:http://www.gotw.ca/gotw/084.htm我发现自己质疑语法含义.

在这篇文章中,香草提出了具有单insert,erasereplace成员,以及多个同名的非成员非友元函数.

这是否意味着,正如我认为的那样,Herb认为某些函数应该与点符号一起使用,其他函数应该作为全局函数使用?

std::string s("foobar");

s.insert( ... ); /* One like this */
insert( s , ...); /* Others like this */
Run Code Online (Sandbox Code Playgroud)

编辑:

感谢大家提供的非常有用的答案,但是,我认为我的问题的观点被忽略了.

我特别没有提到运营商的具体情况,以及他们如何保留"自然"符号.也不应该将所有内容都包装在命名空间中.这些东西写在我链接的文章中.

问题本身是:

在文章中,Herb建议一个insert()方法是成员,而其余的是非成员非朋友函数.

这意味着要使用一种形式的insert(),你必须使用点符号,而对于其他形式,则不需要.

这只是我,还是听起来很疯狂?

我有一种预感,也许你可以使用单一语法.(我在想如何Boost :: function可以为mem_fun取一个*this参数).

c++ class-design

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

有没有办法在任何 SSH 连接/断开连接上运行脚本?

我想根据 ssh 连接的 HOSTNAME 更改我的终端颜色。

我知道如何修改终端,但如何使用 ssh 来添加钩子?

我可以用 shell 函数包装 ssh 命令,或者替换二进制文件,但它被其他应用程序用作依赖项,我宁愿不这样做。

linux ssh

3
推荐指数
1
解决办法
1430
查看次数