小编Mor*_*kus的帖子

从POSIX上的errno和Windows上的GetLastError()构造std :: error_code

我的问题:std::error_codeerrnoPOSIX和GetLastError()Windows上的值构造实例的正确方法是什么,以便可以将实例与众所周知的值进行比较std::errc

更长的解释:我的目标是将一个std::error_code实例添加到一个自制的异常对象,该对象以C++ 11方式在POSIX和Windows系统上运行.

在我的跨平台应用程序中,我使用的是自制的I/O类层次结构,它使用POSIX fopen()和Windows CreateFile()调用来打开/创建文件.如果失败open_error则抛出一个泛型的自制异常(它来自std::exception,是的,但它不是C++的预定义异常类之一).我试图用错误代码扩展这个相当简单的异常; std::error_code如果我理解正确的话,用C++ 11来更精确.

我的问题是如何从errno(在POSIX情况下)或GetLastError()(在Windows情况下)构造这样的对象.对于POSIX,据我所知,我可以简单地使用errnoin std::error_code的构造函数,例如:

std::error_code ec(errno, std::generic_category());
Run Code Online (Sandbox Code Playgroud)

ec应该与众所周知的价值相当std::errc.

对于Windows,可以进行类似的调用,当然:

std::error_code ec(::GetLastError(), std::generic_category());
Run Code Online (Sandbox Code Playgroud)

但是我不确定GetLastError()map 返回的值是否很好地映射到了众所周知的常量std::errc.我在Boost的系统库中读过他们为Boost实现的内容error_code,但我要问的是std实现,而不是关于Boost的实现.

请不要建议切换到使用C++流进行文件访问.我很乐意,但重构我的一半代码并不是我此刻想做的事情.

c++ c++11

21
推荐指数
2
解决办法
5438
查看次数

基于范围的临时对象

我知道一般来说,基于范围的for循环中临时的生命周期延伸到整个循环(我读过C++ 11:基于范围的语句:"range-init"生命周期?).所以做这样的事情一般都可以:

for (auto &thingy : func_that_returns_eg_a_vector())
  std::cout << thingy;
Run Code Online (Sandbox Code Playgroud)

现在,当我尝试做一些我认为与Qt QList容器类似的事情时,我对内存问题感到磕磕绊:

#include <iostream>
#include <QList>

int main() {
  for (auto i : QList<int>{} << 1 << 2 << 3)
    std::cout << i << std::endl;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

这里的问题是valgrind在QList类中的某个地方显示无效的内存访问.但是,修改示例以便将列表存储在变量中可以提供正确的结果:

#include <iostream>
#include <QList>

int main() {
  auto things = QList<int>{} << 1 << 2 << 3;
  for (auto i : things)
    std::cout << i << std::endl;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

现在我的问题是:我在第一种情况下做了一些愚蠢的事情,导致例如未定义的行为(我没有足够的经验阅读C++标准以便为自己回答这个问题)?或者这是我如何使用QList或如何QList …

c++ qt c++11

18
推荐指数
2
解决办法
2451
查看次数

从std :: function返回类型的模板参数类型推导与lambda

首先,我正在使用C++ 11(我的主题很糟糕).

我要做的是编写一个通用模板函数,它实现了通常sort_by在其他编程语言中调用的东西.它涉及精确计算一个范围的每个成员的任意标准,然后根据这些标准对该范围进行排序.这样的标准不一定是POD,它必须是低于可比性的.对于std::less不起作用的东西,调用者应该能够提供她自己的比较函子.

我已经成功编写了使用以下签名的函数:

template<  typename Tcriterion
         , typename Titer
         , typename Tcompare = std::less<Tcriterion>
         >
void
sort_by(Titer first, Titer last,
        std::function<Tcriterion(typename std::iterator_traits<Titer>::value_type const &)> criterion_maker,
        Tcompare comparator = Tcompare()) {
}
Run Code Online (Sandbox Code Playgroud)

它可以像这样使用:

struct S { int a; std::string b; double c; };
std::vector<S> s_vec{
  { 42, "hello", 0.5 },
  { 42, "moo!",  1.2 },
  { 23, "fubar", 0.2 },
};

sort_by1< std::pair<int, double> >(
  s_vec.begin(), s_vec.end(),
  [](S const &one_s) { return std::make_pair(one_s.a, one_s.c); }
); …
Run Code Online (Sandbox Code Playgroud)

c++ c++11

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

empty brace-init-lists发出有关缺少字段初始值设定项的警告

目标:能够列出初始化对象并使默认初始化初始化所有POD为0/false尽可能少的样板(C++ 11).

假设我有几个带有几个POD的类(想想文件格式解析).为了不应对不确定的价值观,我想默认的构造的对象是值初始化为0.例如,提供我自己的默认c'tor是memset()小号this工作正常,这种情况下,如没有明确地命名所有成员.

但是,这是样板.更重要的是,提供我自己的无参数默认构造函数会阻止我使用list initializer语法进行成员初始化:

class Fails1 {
public:
  int a, b;
  Fails1() { memset(this, 0, sizeof(*this)); }
};

Fails1 this_works;
Fails1 this_fails{ 42, 54 }; // compiler error
Run Code Online (Sandbox Code Playgroud)

我也可以添加构造函数initializer_list,但这更是样板.我想避免所有的样板.

所以我看了编译器提供的默认构造函数,当没有用户提供的默认构造函数与各种方法相结合时如何初始化它们.这是我完全糊涂的地方:

class A {
public:
  int a, b;
};
Run Code Online (Sandbox Code Playgroud)

使用这个类,我可以使用空的初始化列表和具有值的那些,而不必自己提供两个构造函数; 这是我想要的一部分.

// Example 1: default initialization
A a1;
Run Code Online (Sandbox Code Playgroud)

第一个例子使用初始化; 成员a并且b之后未定义(不是我想要的,我希望它们被初始化).

// Example 2: Value-initialization, so this works, I guess:
A a2 = A();
Run Code Online (Sandbox Code Playgroud)

示例2使用值初始化,之后不复制.所以这就是我想要的,但是,我也认为空的brace-init-lists会做同样的事情; 请参阅以下示例:

// Example 3: …
Run Code Online (Sandbox Code Playgroud)

c++ c++11

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

如何使用Wget下载XML网页

我想用Unix 从网上下载XML wget.原则上简单地获取它并将其保存到文件中.

这是我使用的命令:

wget http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=pubmed&term=Alum+AND+Adjuvant&retmax=100 --output-document=test.xml
Run Code Online (Sandbox Code Playgroud)

但如果未能下载它.什么是正确的方法?

unix wget

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

如何更改特定基本模式缓冲区的变量

目标:我希望show-trailing-whitespace为所有缓冲区启用一些保存.构成问题的例外情况*Shell Command Output*及其表亲*Async Shell Command*.

我经常show-trailing-whitespace定制到t.因此它在所有新缓冲区中都是活动的.

我还希望关闭某些缓冲区,其中最重要的是缓冲区*Shell Command Output*.这给我带来了一个问题:

  • 输出缓冲区不使用特殊模式; 它还在fundamental-mode.没有fundamental-mode-hook我可以将此设置挂钩.
  • 还有就是after-major-mode-change-hook当主要的模式改为其上运行fundamental-mode,但缓冲在该模式启动,因此这个钩子无法运行.
  • 似乎没有办法融入get-buffer-create.

我知道我可以随时advise使用get-buffer-create这个特定示例的函数,但我尽量避免这种情况.

任何提示?

emacs defadvice advising-functions

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

用perl bug写utf8?

我的问题很简单.我想用我的Perl脚本输出UTF-8.此代码无效.

use utf8;
open(TROIS,">utf8.out.2.txt");
binmode(TROIS, ":utf8");
print TROIS "Hello\n";         
Run Code Online (Sandbox Code Playgroud)

输出文件不是UTF-8.(我的文件脚本以UTF-8编码)但是如果我在我的插入一个突出的字符print,那么它正在工作,我的输出文件是UTF-8.例:

print TROIS "é\n";
Run Code Online (Sandbox Code Playgroud)

我在Windows下使用ActivePerl 5.10.可能是什么问题?

perl utf-8 output

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

PERL如何将本地时间格式转换为unixtime

谁能帮我这个?我在logfilefile中有一个时间值,其格式如下:

2012年8月28日星期二09:50:06

我需要将此时间值转换为unixtime.

问候

perl unix-timestamp

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

请帮助执行基本的Perl代码

#!/usr/local/bin/perl
use warnings;
use strict;

print "Hello, world!\n";
Run Code Online (Sandbox Code Playgroud)

这是我保存为文件test.plcgi-bin.

这是代码,我用来在单独的html文档中运行脚本

 <html> 
 <head> 
 <title>A Very Basic Example of an HTML page created by the CGI</title> 
 </head> 
 <body> 
 <script type="text/javascript" src="http://csvlife.com/cgi-bin/test.pl"></script> 
 </body> 
 </html>
Run Code Online (Sandbox Code Playgroud)

我安装了Perl.模块.我在Hostgator面板中验证了程序路径.可能是什么问题?

perl

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

无法使用"if not exists"创建MySQL表

这是我的代码:

$STH1000=$DBH->query("CREATE TABLE IF NOT EXISTS '".$dept.$year."' ( `ID` INT( 255 ) NOT NULL AUTO_INCREMENT , `URL` VARCHAR( 255 ) NOT NULL , PRIMARY KEY ( `ID` )) ") or die "Could not prepare sql statement";

我想要做的就是创建一个表,如果$ dept $ year不存在,但我现在拥有它的方式,它会抛出错误.

我相信有一种方法来创建一个表是mysql在select上返回一个错误,但我不知道怎么做.任何帮助将不胜感激.

mysql perl

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

删除第一个选项卡和最后一个分号之间的所有内容

我有一个文件,其行如下:

EF457507|S000834932     Root;Bacteria;"Acidobacteria";Acidobacteria_Gp4;Gp4
EF457374|S000834799     Root;Bacteria;"Acidobacteria";Acidobacteria_Gp14;Gp14
AJ133184|S000323093     Root;Bacteria;Cyanobacteria/Chloroplast;Cyanobacteria;Family I;GpI
DQ490004|S000686022     Root;Bacteria;"Armatimonadetes";Armatimonadetes_gp7
AF268998|S000340459     Root;Bacteria;TM7;TM7_genera_incertae_sedis
Run Code Online (Sandbox Code Playgroud)

我想在第一个标签和最后一个分号之间打印任何东西,就像那样

EF457507|S000834932     Gp4
EF457374|S000834799     Gp14
AJ133184|S000323093     GpI
DQ490004|S000686022     Armatimonadetes_gp7
AF268998|S000340459     TM7_genera_incertae_sedis
Run Code Online (Sandbox Code Playgroud)

我试图使用正则表达式,但它不起作用,有没有办法使用Linux,awk或Perl?

perl

0
推荐指数
1
解决办法
166
查看次数

警告:使用未初始化的值替换

为什么Perl会在这种情况下发出警告

Use of uninitialized value `$new` in substitution (s///) at ./perl.pl line 8.
Run Code Online (Sandbox Code Playgroud)

并不是

Use of uninitialized value `$string` in substitution (s///) at ./perl.pl line 8.

#!/usr/bin/env perl
use warnings;
use strict;

my $string;
my $new;

( $new = $string ) =~ s/^.//;
Run Code Online (Sandbox Code Playgroud)

perl warnings initialization substitution

0
推荐指数
1
解决办法
5380
查看次数