问题标签 [user-defined-literals]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1172 浏览

c++ - 我在 C++11 中从未见过的代码

我在看这个源代码

我想知道这是否甚至是有效的C++。

这是什么?不专业的模板专业化?

为什么结构声明里面有代码行

我很困惑..

0 投票
1 回答
10734 浏览

c++ - 如何编写写入 /var/log/myapp 目录的 C/C++ 应用程序?

背景

在 Linux 系统上,应用程序日志存在于 的子目录中/var/log,该目录由root/root我的系统拥有并拥有 755 权限。例如,我看到/var/log/mysql/var/log/samba

问题

如果我希望myapp能够写入 a /var/log/myapp,那么在 C/C++ 中完成此操作的规范方法是什么?

想法

setuid root如果我不想,我是否必须做一些疯狂的事情sudo a_setup_script.sh?请注意,我知道这些syslog例程,但它们不足以满足我的需求(我需要记录更多信息,分成不同的文件,因此需要子目录)。

我是否需要研究 Ubuntu 打包(设置目录)和将文件 IO 定向到子目录(通过myapp)的组合?

我想尽可能地遵循标准。

附录

我忘了提,myapp实际上是一个守护进程(一个监听客户端的服务器),所以拥有一个实际运行/启动进程的myapp_user并不是那么糟糕。

回答

对于 Ubuntu,最好的解决方案似乎rsyslogsyslog. 它将根据需要生成文件/目录,它具有用于灵活路由条目的内置语言,并且在 C/C++ 级别syslog使用简单的旧API。syslog要存储路由信息,您可以在 C/C++ 中定义自己的文本消息编码,并结合适当rsyslog.conf的解码处理。

0 投票
2 回答
455 浏览

c++ - 如何使用 C++11 用户定义文字获取最小变量

我一直在研究 C++11 的一些新特性,其中一些特性给我留下了深刻的印象,尤其是用户定义的文字。

这些允许您定义形式的文字,999_something其中控制对生成文字something所做的操作。999所以不再需要使用:

我认为这会很好地实现大量下划线,就像1_000_000_blahPerl 的可读性一样,尽管 Perl 以某种方式可读的想法对我来说似乎很幽默 :-)

1101_1110_b对于像和这样的二进制值也很方便0011_0011_1100_1111_b

显然,由于_字符的原因,这些将需要是原始模式类型,处理 C 字符串,我可以接受。

知道如何根据操作数大小提供不同的类型。例如:

应该给出一个char(当然假设char是 8 位),而:

将提供 16 位类型。

我可以从文字运算符函数operator""本身(通过计算数字字符)中获取操作数的长度,但返回类型似乎固定在函数中,所以我不能基于此返回不同的类型。

这可以通过_b用户定义类型框架中的单个后缀来完成,还是我需要求助于手动拆分类型(_b8等等_b16)并提供大部分重复的功能?

0 投票
1 回答
202 浏览

c++ - c++11用户定义文字,与编译/执行二分法冲突

我知道 ISO C 标准在分离翻译行为和执行行为方面做了很多工作,部分原因是为了确保交叉编译器不必携带每个目标的执行环境。

我的意思是,与正在运行的程序相比,编译器可用的信息有限。这限制了您可以在源代码中执行的操作,例如不根据函数的返回值初始化变量,如下所示:

我很好奇的是 C++11 中用户定义的文字如何适应这个方案。由于文字评估依赖于一个函数,因此阻止该函数执行以下操作:

  • 返回一个随机值(即使基于输入,例如42_roughly给你一个 40 到 44 之间的值)?
  • 有副作用,例如更改全局变量?

必须调用函数这一事实是否意味着在编译时计算的意义上这些并不是真正的文字?

如果是这样的话,这些文字相对于任何其他函数调用的优势是什么。换句话说,为什么是:

最好:

?

0 投票
1 回答
1280 浏览

c++ - 文字和 constexpr 函数,编译时评估

尝试通过用户定义的文字实现一个令人愉悦的(简单、直接、没有 TMP、没有宏、没有不可读的复杂代码、使用它时没有奇怪的语法)编译时哈希,我发现显然 GCC 对常量表达式的理解是跟我的理解大相径庭。

由于代码和编译器输出超过一千个单词,事不宜迟:

代码非常简单,不需要解释太多,也不需要问太多——除了它不在编译时进行评估。我尝试使用指针取消引用而不是使用数组索引以及在 处进行递归中断!*str,所有这些都得到相同的结果。

后来在麻烦的static_assert水域钓鱼时添加了为什么哈希在编译时不会在我坚信它应该评估的情况下进行评估。好吧,令人惊讶的是,这只让我更加困惑,但并没有澄清任何事情!没有 , 的原始代码static_assert被广泛接受并且编译时没有警告(gcc 4.7.2)。

编译器输出:

我的理解是字符串文字是,嗯......文字。换句话说,一个编译时常量。具体来说,它是一个编译时已知的常量字符序列,从编译器分配的常量地址开始(因此是已知的),以'\0'. 这在逻辑上意味着提供给的文字的编译器计算长度operator""也是 a constexpr

另外,我的理解是,调用constexpr仅具有编译时参数的函数使其可以作为枚举的初始化程序或模板参数,换句话说,它应该导致在编译时进行评估。
当然,原则上总是允许编译器constexpr在运行时评估函数,但毕竟能够将评估转移到编译时是拥有的全部意义constexpr

我的谬误在哪里,有没有一种方法可以实现用户定义的文字,它可以采用字符串文字,以便在编译时实际评估?

可能相关的类似问题:
字符串文字可以在常量表达式中下标吗?
用户定义的文字参数不是 constexpr?
第一个似乎表明至少对于char const (&str)[N]这项工作,GCC 接受它,尽管我承认无法得出结论。
第二个使用整数文字,而不是字符串文字,最后通过使用模板元编程(我不想要)解决了这个问题。那么显然问题不仅限于字符串文字吗?

0 投票
1 回答
852 浏览

c++11 - 用户定义的字符串文字的长度作为模板参数?

有没有办法得到这样的行为?

似乎不是,因为字符串文字会立即传递给文字运算符模板(2.14.8/5),some_return_type operator "" _my_str(const char*, std::size_t);而不是直接传递给文字运算符模板(2.14.8/5)。该大小函数参数不能用作模板参数,即使它几乎总是一个常量表达式。

但似乎应该有某种方法可以做到这一点。


更新:接受的答案是,如果没有每个文字的额外定义,这是不可能的,对于所要求的 C++11 以及 C++14 和 C++17 来说是准确的。C++20 允许要求的确切结果:

0 投票
1 回答
709 浏览

c++ - C++11 用户定义文字

我正在学习 C++11,并且对用户定义的文字感兴趣。所以我决定玩一下它。有些语言有这样的语法:

我试图在 C++11 中模拟这个特性。

但是对于一般情况我无法模拟它,即

自动general_case = 123_456_789;//无法编译

我的问题是“我可以使用 C++11 模拟上述一般情况吗?”。

0 投票
3 回答
383 浏览

c++ - basic_string 文字在编译时是否更快或处理得更好?

在浏览 C++14/C++1y (n3690) 的草稿时,我注意到在第 21.7 节中引入了basic_string文字后缀

我的问题是:

  • basic_string文字是否有可能在运行时更快?
  • 我的“天真”实施完全错误吗?
  • ROM 中的数据布局可以与basic_string文字不同,或者在编译时与运行时有任何其他差异吗?

背景

我知道这允许直接使用这样的字符串文字:

但是,与依赖转换构造函数 string(const char*)相比,这有什么优势呢?

“旧”代码如下所示:

据我所见,实现operator "" s()基本上是这样的:

因此,只需使用相同的 c'tor。我的猜测是,这必须在运行时完成,我错了吗?

编辑:正如Nicol Bolas在下面正确指出的那样,我的示例没有使用相同的构造函数,而是使用具有额外长度的构造函数——显然,这对构造非常有用。这给我留下了一个问题:编译器将字符串文字放入 ROM 或在编译时类似的东西是否更好?

0 投票
1 回答
427 浏览

c++11 - constexpr 运算符中的 C++11 递归 lambda 函数""

在探索 C++11 的 constexpr/operator"' 特性的主题时,我偶然发现了这篇文章: http: //www.codeproject.com/Articles/447922/Application-of-Cplusplus11-User-Defined-Literals-t

它引用了一个示例,说明提供 string-to-binary-number udl 的代码如何:

这一切都像宣传的那样工作,但我不太喜欢全局命名空间被辅助 ToBinary 函数污染。我没有尝试修改函数的名称,而是尝试构想一种解决方案,该解决方案将在 operator"" 主体中嵌入一个递归 lambda 函数。

C++ 中递归 lambda 的解决方案是已知的,它们采用 std::function 用法。为了在 constexpr 运算符“”中实现这一点,需要将递归 lambda 的声明和调用嵌入到单个 return 语句中。我实现这一目标的尝试失败了,所以我求助于 SO 寻求帮助。是否有可能在 constexpr 运算符“”中调用递归 lambda?如果有,有什么提示?

谢谢,

0 投票
2 回答
177 浏览

c++ - 将用户定义的文字与方法调用相结合

我想知道为什么我不能写这样的代码:

GCC 4.8.1 和 Clang 3.4 都抱怨他们找不到文字运算符operator"" _km.to_miles,除非我27_km用括号括起来:

通过阅读标准的第 2.14.8 节,UDL 后缀不能包含句点,那么为什么编译器会这样解析代码呢?它们是正确的还是错误的?

编辑:您可以在此处查看完整示例(具有不同的 UDL 和方法名称):http: //ideone.com/rvB1pk