小编aki*_*kim的帖子

Boost.Locale和isprint

我正在寻找一种方法来显示UTF-8字符串及其非打印/无效字符转义.在ASCII时代,我习惯用来isprint决定一个角色是按原样打印还是转义.使用UTF-8,迭代更加困难,但Boost.Locale做得很好.但是我没有找到任何内容来决定某些字符是否可打印,甚至实际上是否有效.

在以下源代码中,字符串"Hello ??? ? ? \x02\x01\b \xff\xff\xff "包含一些不可打印的坏人(\b例如),而其他人则是普通的无效序列(\xff\xff\xff).我应该进行什么测试才能确定角色是否可打印?

// Based on an example of Boost.Locale.
#include <boost/locale.hpp>
#include <iostream>
#include <iomanip>

int main()
{
  using namespace boost::locale;
  using namespace std;

  generator gen;
  std::locale loc = gen("");
  locale::global(loc); 
  cout.imbue(loc);

  string text = "Hello ??? ?  ? \x02\x01\b \xff\xff\xff ";

  cout << text << endl;

  boundary::ssegment_index index(boundary::character, text.begin(), text.end());

  for (auto p: index)
    {
      cout << '['  << p << '|';
      for (uint8_t c: …
Run Code Online (Sandbox Code Playgroud)

c++ boost utf-8 c++11

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

使用 rdbuf 复制流在空输入时失败

使用rdbuf以下方法将流复制到另一个流中是一种众所周知的方法:

#include <iostream>
#include <fstream>

int main()
{
  std::ifstream in{"/tmp/foo.txt"};
  std::cerr << in.rdbuf();
  std::cerr << "Done\n";
}
Run Code Online (Sandbox Code Playgroud)

但是,这会中断(= 设置坏位) my cerrwhen/tmp/foo.txt为空。结果,Done\n不显示。

这是为什么?使用 G++/libstdc++/GNU Linux 和 Clang++/libc++/OS X 观察。

c++ stream ostream

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

提升精神X3生产准备好了吗?

我正在将一个手写的解析器迁移到Boost.Spirit(2.5.4).第一印象是积极的,但由于我使用C++ 17,X3似乎是一个非常有吸引力的选择.

幸运的是,有很多关于X3的资源:

然而:

  • Boost.Org 上没有什么,给人的印象是,虽然Spirit X3是Boost的一部分,但它更像是一个偷渡者而不是头等舱乘客
  • 截至今天,似乎发展于2014年6月停止

所以我很担心:X3是个好赌注吗?不仅仅是维护,而且它与前一代产品相比还能保留其产品吗?

编辑

我的作业很糟糕,其他地方也有类似的问题:

boost-spirit boost-spirit-qi boost-spirit-x3

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

为什么 cmath 不使用模板和/或重载

TR1 在 C++11 中引入的许多新函数都具有丑陋的类似 C 的签名。例如,引用Boost的TR1文档(http://www.boost.org/doc/libs/1_52_0/doc/html/boost_tr1/subject_list.html#boost_tr1.subject_list.special):

// [5.2.1.1] associated Laguerre polynomials:
double assoc_laguerre(unsigned n, unsigned m, double x);
float assoc_laguerref(unsigned n, unsigned m, float x);
long double assoc_laguerrel(unsigned n, unsigned m, long double x);
Run Code Online (Sandbox Code Playgroud)

显然,人们更喜欢某种模板化实现(这实际上是 Boost 中这些函数的“本机”签名),或者至少是某种重载而不是多个标识符。

我可以理解,以 C 兼容性为目标意味着支持这些标识符,但这对于纯 C++ 使用者来说是一个麻烦。除了 之外<cmath>,还可能有一些<math>具有更自然界面的 。

我缺少什么(除了可能之前提出的一些问题)?

c++ templates overloading tr1 cmath

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

如何创建boost phoenix make_shared?

有可能创建boost phoenix lazy变种std::make_shared吗?我的意思是,做一些类似的事情

namespace p = boost::phoenix;
...
expr = custom_parser[_a=p::make_shared<Node>(_1,_2,_3)] >> ...
Run Code Online (Sandbox Code Playgroud)

BOOST_PHOENIX_ADAPT_FUNCTION由于可变模板的性质,人们无法使用std::make_shared.所以,如果有可能写一个包装器,那么包装器应该是variadic模板本身.

c++ boost boost-phoenix make-shared

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

如何解决 ruby​​ on Rails 中的“false.blank?”问题?

我需要检查布尔变量是否已设置其值,我可以通过检查它是否包含空字符串""nil指示该值尚未设置以及另一个值truefalse指示该值已设置来知道。

我尝试使用,blank?但 Railsblank?在调用时false实际上会返回的方法上有这个问题true

false.blank? # Returns true

因此,当变量的值设置为 false 时,它​​会给我该值的误报,就好像该变量尚未设置一样。

如何在 Ruby on Rails 中检查变量是否未设置("", nil)或已设置(true, false, 0, )?1

ruby-on-rails

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

constexpr 函数内的静态表

我有一段将整数映射到整数的生成代码,其核心是一个简单的表。在 C++17 之前,它曾经是这样的:

int convert (int v)
{
  static const int table[] = { 3, 2, 6, 1, 7, 1, 6, 8 };

  if (0 <= v && v < sizeof table / sizeof table[0])
    return table[v];
  else
    return -1;
}
Run Code Online (Sandbox Code Playgroud)

使用 C++17,我想使用 constexpr。我预计增加constexpr的函数签名就足够了,但我要删除static表,这让我实施显然没有很好的理由更加复杂。没有太多提及,table在非constexpr情况下很可能会在堆栈上,所以我想我应该更换 staticconstexpr

G++ 8 报告:

/tmp/foo.cc: In function 'constexpr int convert(int)':
/tmp/foo.cc:14:26: error: 'table' declared 'static' in 'constexpr' function
   static const int table[] = { …
Run Code Online (Sandbox Code Playgroud)

c++ constexpr c++17

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

升压::精神::气

请考虑以下代码:(Boost.Spirit 2.5.1)

qi::parse(str.begin(), str.end(), (+qi::alpha)[[](const string& s){cout << s<< '\n';}]
                                    >> (*(qi::char_(',') | qi::char_('\'')))
                                    >> qi::uint_[[](int integer){cout << integer << '\n';}]);
Run Code Online (Sandbox Code Playgroud)

[[](int integer){cout << integer << '\n';}]作品,但类似的代码+qi::alpha没有.

我该如何更正代码?

c++ boost boost-spirit c++11

4
推荐指数
2
解决办法
1827
查看次数

在 libc++ 中使用 g++

让 clang++ 使用 GCC 的 libstdc++ ( -stdlib=stdc++)是很容易的,但是我该如何做相反的事情呢?在 OS X Mavericks 上,c++ 系统库是 libc++,这意味着基本上不能使用 libstdc++(如果你与其他 c++ 库如已经用 libc++ 编译的 boost 混合)。所以,粗略地说,这意味着 G++ 不可用......除非我可以要求它使用 libc++ 而不是 libstdc++。

谢谢。

我使用的脚本(编辑)

我正在使用以下脚本g++-libc++在带有 MacPorts 的 Mac OS X 上在 libc++ 之上运行 g++(因此-mp名称。

#! /bin/sh

clangxx=clang++-mp-3.5
gxx=g++-mp-4.9

libcxx_includes=$($clangxx -print-search-dirs |
                  perl -ne 's{^libraries: =(.*)}{$1/../../../} && print')

exec $gxx -std=c++11 \
   -isystem ${libcxx_includes}/include/c++/v1 \
   -nostdinc++ -nodefaultlibs \
   -lc -lc++ -lc++abi -lgcc_s.10.5 \
   -Wl,-no_compact_unwind \
   "$@"
Run Code Online (Sandbox Code Playgroud)

g++ libstdc++ clang++ libc++ osx-mavericks

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

为什么数组中的 splat 成本如此之高?

我喜欢使用 splat 构建数组和哈希:

\n
    \n
  • 它们是数组和散列文字,因此您不必进行一些计算来查看得到的值类型,语法非常清晰
  • \n
  • 它们使在单个表达式中构建相当复杂的值变得容易,而不是使用更命令式的样式(是的,您可以使用诸如 之类的东西变成单个赋值tap,但它的可读性较差)。
  • \n
\n

然而,泼溅的成本很高。

\n
require \'benchmark\'\n\n$array = (0...100).to_a\n\nn = 100_000\nBenchmark.bm do |x|\n  x.report(\'add   \') {n.times{$array + $array + $array}}\n  x.report(\'splat \') {n.times{[*$array, *$array, *$array]}}\nend\n
Run Code Online (Sandbox Code Playgroud)\n

在机器 A (MRI 3.1.3) 上我有:

\n
          user     system      total        real\nadd     0.031583   0.001421   0.033004 (  0.033006)\nsplat   0.050174   0.001397   0.051571 (  0.051584)\n
Run Code Online (Sandbox Code Playgroud)\n

在机器 B (MRI 2.7.4) 上:

\n
          user     system      total        real\nadd     0.278377   0.000000   0.278377 (  0.278316)\nsplat   0.780735   0.043730   0.824465 (  0.824377)\n
Run Code Online (Sandbox Code Playgroud)\n

为什么基于 splat …

ruby arrays performance

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