为什么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)
这是一种疏忽,被认为不够重要,还是有特定的技术原因?
我有一个抽象的基类作为接口.
我有两个派生类的"集合",它们实现了抽象类的一半.(一个"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) 我正在编写一个阻止两个输入的应用程序istreams.
从两者中读取istream是同步(阻塞)调用,因此,我决定创建两个Boost::threads来进行读取.
这些线程中的任何一个都可以到达"结束"(基于接收的一些输入),并且一旦达到"结束",两个输入流都停止接收.不幸的是,我不知道哪个会这样做.
因此,我不能join()在两个线程上,因为只有一个线程(不能预定哪一个)将实际返回(解除阻塞).
我必须以某种方式强迫对方退出,但它被阻止等待输入,所以它本身不能决定是时候返回(条件变量或什么不是).
他们是一种方式:
istream"失败",或注意:
istreams就是cin编辑:
谢谢!
使用时,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)
仍在寻找一种更简单的方法来做到这一点!
我正在尝试使用两个具有相同名称的方法创建一个类,用于访问私有成员.一种方法是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) 即:
[](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)
但我真的希望这是一个更容易的选择!
在修改底层容器时,我没有找到任何对 range/range-adaptor/range-view 特定失效规则的直接引用。
\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那么:是否可以强制随机访问容器上的某些等效项std::ranges::views\xe2\x80\x8b::\xe2\x80\x8ball(或者也许是take_view)使用数组索引(或某些等效的间接/惰性元素访问),而不直接使用迭代?
允许这样做的东西:
\n\nstd::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}\nRun Code Online (Sandbox Code Playgroud)\n 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')仅捕获模块导入错误,但首先查看是否存在"标准"解决方案.
他们是否可以使用与成员函数相同的"点"表示法在对象上使用非成员非友元函数?
我可以从一个类中拉出(任何)成员,并让用户以他们一直使用的方式使用它吗?
更长的解释:
Scott Meyers,Herb Sutter等人认为,非成员非朋友函数是对象接口的一部分,可以改进封装.我同意他们.
但是,在最近阅读本文之后:http://www.gotw.ca/gotw/084.htm我发现自己质疑语法含义.
在这篇文章中,香草提出了具有单insert,erase和replace成员,以及多个同名的非成员非友元函数.
这是否意味着,正如我认为的那样,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参数).
我想根据 ssh 连接的 HOSTNAME 更改我的终端颜色。
我知道如何修改终端,但如何使用 ssh 来添加钩子?
我可以用 shell 函数包装 ssh 命令,或者替换二进制文件,但它被其他应用程序用作依赖项,我宁愿不这样做。
c++ ×8
c++11 ×2
linux ×2
auto ×1
boost ×1
boost-asio ×1
boost-thread ×1
c++20 ×1
class-design ×1
inheritance ×1
iostream ×1
lambda ×1
node.js ×1
npm ×1
range ×1
regex ×1
ssh ×1