标签: tie

使用std :: tie作为循环目标的范围

我想做类似以下的事情:

//std::vector<std::pair<TypeA, TypeB>> someInitializingFunction();
{
  TypeA a;
  TypeB b;

  for (std::tie(a, b) : someInitializingFunction()) {
    // do stuff;
  }
}
Run Code Online (Sandbox Code Playgroud)

但是,这不是有效的代码,因为正如标准所说,基于for循环的范围被定义为等效于:

{
  auto && __range = range-init;
  for ( auto __begin = begin-expr,
      __end = end-expr;
      __begin != __end;
      ++__begin ) {
    for-range-declaration = *__begin;
    statement
  }
}
Run Code Online (Sandbox Code Playgroud)

其中for-range-declaration定义为:

for-range-declaration:attribute-specifier-seq_ {opt} decl-specifier-seq声明符

那么阻碍我的是decl-specifier-seq没有标记为可选的?

因此,似乎我必须依靠旧式的循环来实现这个问题:

std::vector<std::pair<TypeA, TypeB>> myList = someInitializingFunction();

{
  TypeA a;
  TypeB b;

  for (auto it = myList.begin(); it != myList.end(); ++it) {
    std::tie(a, b) = *it;
    // do …
Run Code Online (Sandbox Code Playgroud)

c++ for-loop tie language-lawyer std-pair

24
推荐指数
2
解决办法
5772
查看次数

我如何勾选Perl的印刷品?

这是一个场景.您有大量遗留脚本,都使用公共库.所述脚本使用'print'语句进行诊断输出.脚本不允许任何变化 - 它们的范围广泛,得到了批准,并且早已离开了监督和控制的富有成效的山谷.

现在出现了新的需求:现在必须将日志记录添加到库中.这必须自动且透明地完成,标准库的用户无需更改其脚本.公共库方法可以简单地添加日志记录调用; 这是最简单的部分.困难的部分在于这些脚本的诊断输出始终使用'print'语句显示.必须存储此诊断输出,但同样重要的是,处理.

作为此处理的示例,库应仅记录包含"警告","错误","通知"或"注意"字样的打印行.下面的极其琐碎和被控制的示例代码(tm)将记录一些所述输出:

sub CheckPrintOutput
{
    my @output = @_; # args passed to print eventually find their way here.
    foreach my $value (@output) {
         Log->log($value) if $value =~ /warning|error|notice|attention/i;
    }
}
Run Code Online (Sandbox Code Playgroud)

(我想避免诸如"实际上应该记录什么","打印不应该用于诊断","perl糟透了"或"此示例有缺陷xy和z'等问题......这是为简洁和清晰而大大简化.)

基本问题归结为捕获和处理传递给print的数据(或任何perl builtin,沿着这些推理线).可能吗?有什么方法干净利落的吗?是否有任何具有钩子的记录模块可以让你这样做?或者它应该像瘟疫一样应该避免,我应该放弃捕获和处理打印输出?

附加:这必须运行跨平台 - 窗口和*nix相似.运行脚本的过程必须保持不变,脚本的输出也必须保持不变.

其他附加:在codelogic的回答评论中提出了一个有趣的建议:

您可以继承http://perldoc.perl.org/IO/Handle.html并创建自己的文件句柄来执行日志记录工作. - Kamil Kisiel

这可能会这样做,有两点需要注意:

1)我需要一种方法将此功能导出到使用公共库的任何人.它必须自动应用于STDOUT,也可能是STDERR.

2) IO :: Handle文档说你不能将它子类化,到目前为止我的尝试都没有结果.是否有任何特殊需要使子类化IO :: Handle工作?标准的'使用基础'IO :: Handle'然后覆盖new/print方法似乎什么都不做.

最终编辑:看起来像IO :: Handle是一个死胡同,但Tie :: Handle可能会这样做.感谢所有的建议; 他们都非常好.我将试试Tie :: Handle路线.如果它导致问题我会回来的!

附录:请注意,在使用了这个之后,我发现如果你没有做任何棘手的事情,Tie :: Handle会起作用.如果您使用IO :: Handle的任何功能与绑定的STDOUT或STDERR,它基本上是一个让它们可靠地工作的废话 - 我找不到一种方法来获得IO :: Handle的autoflush方法来处理我的绑定处理.如果我在绑上手柄之前启用了autoflush,它就能正常工作.如果这对您有用,可以接受Tie :: Handle路线.

printing perl hook tie

20
推荐指数
3
解决办法
6784
查看次数

如何制作const引用的元组?

说有两个功能:

void ff( const std::tuple<const int&> ) { }

template < typename TT >
void gg( const std::tuple<const TT&> ) { }
Run Code Online (Sandbox Code Playgroud)

并调用这些函数:

int xx = 0;
ff( std::tie( xx ) ); // passes
gg( std::tie( xx ) ); // FAILS !!
Run Code Online (Sandbox Code Playgroud)

GCC 4.7.2无法编译最后一行并报告错误说明,如:

note:   template argument deduction/substitution failed:
note:   types ‘const TT’ and ‘int’ have incompatible cv-qualifiers
note:   ‘std::tuple<int&>’ is not derived from ‘std::tuple<const TT&>’
Run Code Online (Sandbox Code Playgroud)

第一个问题是,如果这符合C++ 11标准,如果不符合,那么为什么呢?

此外,要克服这个问题,需要传递一个const引用元组,gg而不是传递一个非const引用元组(这std::tie使得).这可以通过以下方式完成:

gg( std::tie( std::cref(x) ) );
Run Code Online (Sandbox Code Playgroud)

然而,额外的调用std::cref …

c++ gcc tuples tie c++11

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

更新MySQL表中的排名

我有一个表Player的以下表结构

Table Player {  
Long playerID;  
Long points;  
Long rank;  
}
Run Code Online (Sandbox Code Playgroud)

假设玩家ID和积分具有有效值,我可以根据单个查询中的积分数更新所有玩家的等级吗?如果两个人拥有相同数量的积分,那么他们应该排名等级.

更新:

我正在使用hibernate使用建议作为本机查询的查询.Hibernate不喜欢使用变量,特别是':'.有谁知道任何变通方法?通过不使用变量或在这种情况下使用HQL解决hibernate的限制?

mysql hibernate tie rank

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

在Perl中,有没有办法打破藏匿?

类似于AUTOLOAD可以根据需要定义子例程的方式,我想知道是否有办法绑定一个包的存储,以便我可以拦截对该包中变量的访问.

我尝试了以下想法的各种排列,但似乎都没有效果:

{package Tie::Stash;
    use Tie::Hash;
    BEGIN {our @ISA = 'Tie::StdHash'}
    sub FETCH {
        print "calling fetch\n";
    }
}

{package Target}

BEGIN {tie %Target::, 'Tie::Stash'}

say $Target::x;  
Run Code Online (Sandbox Code Playgroud)

Bad symbol for scalar ...在最后一行死亡,没有打印"calling fetch".如果say $Target::x;删除该行,程序将运行并正确退出.

我的猜测是失败与stashes有关,但与散列不一样,所以标准的tie机制不能正常工作(或者它可能就是stash lookup永远不会调用tie魔法).

有谁知道这是否可能?Pure Perl是最好的,但XS解决方案还可以.

perl tie perl-stash

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

为什么我的Perl程序使用Tie :: File和Unicode/UTF-8编码失败?

我正在开发一个处理外语数据的项目.我的Perl脚本运行正常.

然后我想使用Tie :: File,因为这是一个简洁的概念(并节省时间和编码).

看起来Tie:File在Unicode/UTF-8下失败了(除非我遗漏了什么).

这是一个描述问题的程序:(数据是英语,希腊语和希伯来语的混合):

use strict;
 use warnings;
 use 5.014; 
 use Win32::Console;
 use autodie; 
 use warnings qw< FATAL utf8 >;
 use Carp;
 use Carp::Always;
 use utf8;
 use feature        qw< unicode_strings>;
 use charnames      qw< :full>;
use Tie::File;

my ($i);
my ( $FileName);
my (@Tied);
binmode STDOUT, ':unix:utf8';
binmode STDERR, ':unix:utf8';
binmode $DB::OUT, ':unix:utf8' if $DB::OUT; # for the debugger
Win32::Console::OutputCP(65001);         # Set the console code page to UTF8

$FileName = 'E:\\My Documents\\Technical\\Perl\\Eclipse workspace\\Work\\'.
        'Tie File test res.txt';
tie @Tied, …
Run Code Online (Sandbox Code Playgroud)

unicode perl utf-8 tie

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

为什么Tie :: File会在文件排序时添加一行?

我有这个应该对文件进行排序的perl脚本:

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

use Tie::File;

tie my @lines, 'Tie::File', 'fileToBeSorted.txt' or die $!;

printf "line count before: %d\n", scalar @lines;

@lines= sort @lines;

printf "line count after: %d\n", scalar @lines;

untie @lines;
Run Code Online (Sandbox Code Playgroud)

使用此输入运行时(fileToBeSorted.txt)

one;4;1
two;3;2
three;2;3
four;1;4
Run Code Online (Sandbox Code Playgroud)

脚本输出

line count before: 4
line count after: 5
Run Code Online (Sandbox Code Playgroud)

实际上,排序文件包含一个空的第五行.为什么这样,我怎么能防止这种情况?

perl tie

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

评估Readonly变量两次时的结果不同

我注意到,对于使用Readonly模块声明的变量,多次计算变量会产生不同的结果.

>perl -Mbigint -MReadonly -wE "Readonly my $V => 1; foreach (1..2) { say 0 + '1000000000000001' * $V };
1000000000000000
1000000000000001
Run Code Online (Sandbox Code Playgroud)

这是为什么?这似乎是第一次在字符串中解释变量,第二次在数字上下文中.我的猜测是,如果它是数字,Math::BigInteger模块将重载'*'运算符,产生精确的结果.这是Readonly模块中的错误,有什么办法可以避免这种情况吗?

我没有使用perl 5.10和Readonly 1.03 Readonly::XS.

我可以重现那个

  • v5.10.0on MSWin32-x86-multi-thread(ActivePerl)
  • v5.10.0在linux上x86_64-linux-thread-multi.
  • v5.12.0 在Windows上(ActivePerl)

但是,我并没有v5.14.2(ActivePerl).

我也用Readonly 1.04复制了它.我不太确定这是否相关,但Scalar::Util::looks_like_number表现相似:

>perl -MReadonly -MScalar::Util -Mbigint -wE "say $Readonly::VERSION; Readonly my $V => 1; foreach (1..2) { say Scalar::Util::looks_like_number $V; }"
1.04
0
1
Run Code Online (Sandbox Code Playgroud)

perl operator-overloading biginteger readonly tie

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

在C++中解压缩嵌套元组

std::tie 提供了一种方便的方法,可以将C++中元组的内容解压缩为单独定义的变量,如下面的示例所示

int a, b, c, d, e, f;

auto tup1 = std::make_tuple(1, 2, 3);
std::tie(a, b, c) = tup1;
Run Code Online (Sandbox Code Playgroud)

但是,如果我们有一个像下面这样的嵌套元组

auto tup2 = std::make_tuple(1, 2, 3, std::make_tuple(4, 5, 6));
Run Code Online (Sandbox Code Playgroud)

试图编译代码

std::tie(a, b, c, std::tie(d, e, f)) = tup2;
Run Code Online (Sandbox Code Playgroud)

失败并出错

/tmp/tuple.cpp:10: error: invalid initialization of non-const reference of type ‘std::tuple<int&, int&, int&>&’ from an rvalue of type ‘std::tuple<int&, int&, int&>’
  std::tie(a, b, c, std::tie(d, e, f)) = tup2;
                            ^
Run Code Online (Sandbox Code Playgroud)

有没有一种惯用的方法来解压缩C++中的元组元组?

c++ tuples tie c++11

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

如何在插入顺序中将哈希值提取到数组中?

给定Perl中的哈希值(任何哈希值),如何从该哈希值中提取它们的顺序,并将它们放入数组中?

例:

my %given = ( foo => '10', bar => '20', baz => '15' );
Run Code Online (Sandbox Code Playgroud)

我想得到以下结果:

my @givenValues = (10, 20, 15);
Run Code Online (Sandbox Code Playgroud)

perl hash tie

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