小编Ton*_*roy的帖子

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

C++中是否存在非短路逻辑"和"?

tl; dr:C++中是否存在非短路逻辑AND(类似于&&)?

我有两个我想调用的函数,并使用返回值来计算第三个复合函数的返回值.问题是我总是希望评估两个函数(因为它们输出有关系统状态的日志信息)

IE:

bool Func1(int x, int y){
  if( x > y){
    cout << "ERROR- X > Y" << endl;
  }
}
bool Func2(int z, int q){
  if( q * 3 < z){
    cout << "ERROR- Q < Z/3" << endl;
  }
}
bool Func3(int x, int y, int z, int q){
  return ( Func1(x, y) && Func2(z, q) );
}
Run Code Online (Sandbox Code Playgroud)

当然,条件语句是不是在功能那么简单,是的,我知道我可以使用临时变量来存储的两个函数的返回,接着做临时变量"短路"的逻辑,但我想知道是否有一个"优雅"的语言解决方案来保持Func3中的单行返回,同时仍然从两个函数获取日志消息.


答复摘要:

"按位"运算符| 和&可用于获得效果,但仅当返回类型为bool时.我在ANSI C++规范中没有提到这一点.从我可以告诉,这个工程因为"布尔"被转换为int(真= 1,假= 0),然后将位运算符时,则转换回一个布尔值.

也可以使用运算符" +"和" *".这在ANSI C++规范中没有提到,但可能因为与上述相同的原因而起作用." +"给"或"因为true被转换为1,然后除了0之外的任何东西都被转换回true." *"适用于"和"因为1(真)*0(假)== 0(假)和1(真)*1(真)== …

c++ operators logical-operators

30
推荐指数
3
解决办法
6340
查看次数

请求"......"中的成员"...",这是非类型"......"

我一直在寻找几个小时试图弄清楚我做错了什么,而且我已经摆脱了我的大多数问题但是当我尝试编译我的代码时,main()它会出现同样的错误信息:

request for member "..." in "..." which is of non-class type "..."
Run Code Online (Sandbox Code Playgroud)

它会重复我尝试调用的所有函数main().问题是什么?我无法弄清楚我的错误在哪里.

我在macbook上使用Terminal来编译代码.

这是我的主要功能:

//Program1.cpp
//Program1Math test function
#include "Program1Math.h"

int main()
{
  //Create a Program1Math object
  Program1Math myProgram1Math();

  myProgram1Math.setNumber1();
  myProgram1Math.setNumber2();

  myProgram1Math.displayMultiple();
  myProgram1Math.displaySine1();
  myProgram1Math.displayTangent1();
  myProgram1Math.displaySine2();
  myProgram1Math.displayTangent2();
}
Run Code Online (Sandbox Code Playgroud)

以下是该类的成员函数定义:

//Program1Math.cpp
//Program1Math member-function definitions.
#include <iostream>
#include <cmath>
#include "Program1Math.h"
using namespace std;

//constructor makes a Program1Math, adds an blank line
Program1Math::Program1Math()
{
  cout << "/n";
}

//function to assign the first integer to its appropriate …
Run Code Online (Sandbox Code Playgroud)

c++ compiler-errors

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

从向量中提取最小,最大和中位数的最有效方法是什么

vector<T> vec{...}假设T是一种数值类型,给定一种提取其最小值,最大值和中位数的最佳方法是什么?我知道的std::nth_element还有std::minmax_element,但他们似乎做多余的工作,如果叫了一个又一个。

到目前为止,我想到的最好的主意是一次叫std :: nth_element 3次。但这仍然需要3N比较,对吗?有什么方法可以重用先前迭代中完成的部分排序吗?

c++ algorithm median

13
推荐指数
1
解决办法
649
查看次数

C++ boost asio Windows文件句柄async_read_until无限循环 - 没有eof

我正在使用VS2010的boost 1.50,使用Windows文件HANDLE读取(与使用套接字的asio相比,这似乎相对不常见).

问题

handle_read回调获取到线8并返回与所有所附线1的第一位; 进一步的回调再次从第2行循环,令人作呕:

  • 打开一个简短的文本文件(如下)
  • 获得handle_read具有第1行到第7行的正确内容的预期回调
  • 下一个回调的字节读取 length参数长于预期
  • 虽然没有使用length,但是从asio流缓冲区中getline提取相应更长的行
  • 提取内容切换到中间行以从输入文件重复第一行
  • 进一步的handle_read回调回收第2行到第7行,然后发生"长混合"线问题
  • ad nauseum

输入

LINE 1 abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
LINE 2 abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
...3--E similarly...
LINE F abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
Run Code Online (Sandbox Code Playgroud)

产量

这是前15行输出(它永远持续):

line #1, length 70, getline() [69] 'LINE 1 abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
line #2, length 70, getline() [69] 'LINE 2 abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
...line #3 through #6 are fine too...
line #7, length 70, getline() [69] 'LINE 7 abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' …
Run Code Online (Sandbox Code Playgroud)

c++ file-io boost asynchronous boost-asio

12
推荐指数
2
解决办法
3239
查看次数

C++ - const members/return const int&vs return int

这些C++行是什么意思?有没有其他方法来编写它们?

const int& a() const;
int getA() const;
Run Code Online (Sandbox Code Playgroud)

谢谢.

c++

10
推荐指数
2
解决办法
5625
查看次数

了解有关i ++和i = i + 1的更多信息

我想知道两种增量形式之间是否存在差异.一些链接说i ++比i = i + 1更快;

另外作为人之一,我的观察对于汇编代码也是一样的.请检查图像,其中汇编代码对于i ++和i = i + 1都是相同的 - 在此输入图像描述

还有另一个链接说,之前的增量运算符比加法和赋值更快,但现在编译器优化i ++和i = i + 1相同.

是否有任何官方文件/文件我们可以参考确认什么是正确的?(我通常会使用信用卡和一个人在stackoverflow上接受的答案数量.在我提供的链接上找不到任何此类信息).

c c++ optimization assembly post-increment

10
推荐指数
2
解决办法
1619
查看次数

Delphi中的一元++运算符

我怀疑答案是否定的,但是有没有相当于C++一元前缀和后缀增量运算符"++".例如.

int test = 1;
SomeFunc(test++);    // test is 1 inside SomeFunc and 2 afterwards
test = 1;
Somefunc(++test);    // test is 2 inside SomeFunc and 2 afterwards
Run Code Online (Sandbox Code Playgroud)

我知道Delphi中的Inc(和Dec)运算符,但是你不能将它传递给函数,如:

test: Integer;
//...
SomeFunc(Inc(test));   // compiler error, incompatible types
Run Code Online (Sandbox Code Playgroud)

除了编译错误之外,似乎没有不同的前缀和后缀增量.写这样的代码不是一个大问题:

SomeFunc(test);
test := (test + 1);
SomeFunc(test);
Run Code Online (Sandbox Code Playgroud)

但是C++中的++(和 - )运算符是一个很棒的特性.

delphi

10
推荐指数
1
解决办法
2000
查看次数

如何连接Popen stdin的多个文件

我正在将一个bash脚本移植到python 2.6,并想要替换一些代码:

cat $( ls -tr xyz_`date +%F`_*.log ) | filter args > bzip2
Run Code Online (Sandbox Code Playgroud)

我想我想要一些类似于http://docs.python.org/release/2.6/library/subprocess.html上的"替换shell管道"示例,ala ...

p1 = Popen(["filter", "args"], stdin=*?WHAT?*, stdout=PIPE)
p2 = Popen(["bzip2"], stdin=p1.stdout, stdout=PIPE)
output = p2.communicate()[0]
Run Code Online (Sandbox Code Playgroud)

但是,我不确定如何最好地提供它p1stdin值,以便它连接输入文件.似乎我可以添加......

p0 = Popen(["cat", "file1", "file2"...], stdout=PIPE)
p1 = ... stdin=p0.stdout ...
Run Code Online (Sandbox Code Playgroud)

...但这似乎超越了使用(缓慢,低效)管道来调用具有重要功能的外部程序.(任何体面的shell都会在cat内部执行.)

所以,我可以设想一个满足文件对象API要求的自定义类,因此可以用于p1的stdin,连接任意其他文件对象.(编辑:现有答案解释了为什么这是不可能的)

难道蟒蛇2.6有一个机制,解决这方面的需要/想,或其他可能Popencat在Python界被认为是完美的罚款?

谢谢.

python pipe concatenation popen

9
推荐指数
1
解决办法
2725
查看次数

一个python lambda/fn可以代表一个任意调用者吗?

更新:示例现在列出所需的结果(下方以粗体显示)

我发现自己编写了许多搜索一些数据的函数,我想让调用者在找到匹配项时指定行为:它们可能会打印出一些内容或将其添加到其中一个数据结构中,但也非常希望能够可选地返回找到的数据以进一步传输,存储或处理.

def find_stuff(visitor):    # library search function
    for x in (1, 2, 3, 4, 5, 6):
        visitor(x)
Run Code Online (Sandbox Code Playgroud)

首次客户使用:

def my_visitor(x):   # client visitor functions (also often use lambdas)
    if x > 3:
        yield x / 2   #>>> WANT TO DO SOMETHING LIKE THIS <<<#

results = find_stuff(my_visitor)   # client usage
Run Code Online (Sandbox Code Playgroud)

results 应该产生4/2,5/2,然后是6/2 ......即2,2,3.

第二个客户使用:

def print_repr_visitor(x):
    print repr(x)

find_stuff(print_repr_visitor)     # alternative usage
Run Code Online (Sandbox Code Playgroud)

应打印1 2 3 4 5 6(单独的行)但不产生任何结果

但是,它yield并没有在"结果"中创建一个生成器(至少使用python 2.6.6,我坚持使用).


我试过的

我一直在乱砍这个,经常这样......

def find_stuff(visitor):
    for x …
Run Code Online (Sandbox Code Playgroud)

python lambda yield generator

9
推荐指数
1
解决办法
742
查看次数