我正在寻找一种方法来显示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) 使用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 观察。
我正在将一个手写的解析器迁移到Boost.Spirit(2.5.4).第一印象是积极的,但由于我使用C++ 17,X3似乎是一个非常有吸引力的选择.
幸运的是,有很多关于X3的资源:
然而:
所以我很担心:X3是个好赌注吗?不仅仅是维护,而且它与前一代产品相比还能保留其产品吗?
我的作业很糟糕,其他地方也有类似的问题:
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>具有更自然界面的 。
我缺少什么(除了可能之前提出的一些问题)?
有可能创建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模板本身.
我需要检查布尔变量是否已设置其值,我可以通过检查它是否包含空字符串""或nil指示该值尚未设置以及另一个值true或false指示该值已设置来知道。
我尝试使用,blank?但 Railsblank?在调用时false实际上会返回的方法上有这个问题true
false.blank? # Returns true
因此,当变量的值设置为 false 时,它会给我该值的误报,就好像该变量尚未设置一样。
如何在 Ruby on Rails 中检查变量是否未设置("", nil)或已设置(true, false, 0, )?1
我有一段将整数映射到整数的生成代码,其核心是一个简单的表。在 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情况下很可能会在堆栈上,所以我想我应该更换 static的constexpr。
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) 请考虑以下代码:(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没有.
我该如何更正代码?
让 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) 我喜欢使用 splat 构建数组和哈希:
\ntap,但它的可读性较差)。然而,泼溅的成本很高。
\nrequire \'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\nRun 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)\nRun 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)\nRun Code Online (Sandbox Code Playgroud)\n为什么基于 splat …