我将Emacs与AUCTeX结合使用,使用大量的内联数学编辑手稿$
.当自动填充(例如,有M-q)时,Emacs经常在扰乱阅读流畅性的位置(例如,在下标等中)打破这些内联数学环境.
有没有办法告诉Emacs更愿意将整个$…$
环境放在一个新的行中,如果这样可以防止破坏?更具体地说,如果发生数学中断,则应将整个环境移动到不应该分开的新行.
一个例子:
Lorem ipsum dolor sit amet, consectetur adipisici elit, sed $a^2 + b^2 = c^2$ eiusmod tempor incidunt ut labore et dolore magna aliqua. Ut enim ad minim veniam.
Run Code Online (Sandbox Code Playgroud)
应该导致
Lorem ipsum dolor sit amet, consectetur adipisici elit, sed
$a^2 + b^2 = c^2$ eiusmod tempor incidunt ut labore et dolore magna
aliqua. Ut enim ad minim veniam.
Run Code Online (Sandbox Code Playgroud) 当使用pre预分配时std::string::reserve
,我必须明确添加一个用于终止0
,以避免重新分配和后续复制?
例如,知道"Hello"
长度为5 的字符串将被存储std::string str
,我是否必须调用str.reserve(6)
?
如果我正确地阅读了标准,那么我认为答案应该是肯定的.因为reserve
它说
在reserve()之后,capacity()大于或等于reserve的参数.
并capacity
反过来它规定
返回:字符串中已分配存储的大小.
不过,我不熟悉标准中配方的细微之处,我想证实我的怀疑.
作为一种隐含的理解,我一直认为std::string
必须满足strlen(str.c_str()) == str.length()
每个字符串的每个实现str
.
C++标准对此有何看法?(可以?)
背景:至少Visual C++和gcc附带的实现没有此属性.考虑这个例子(参见这里的实例):
// Output:
// string says its length is: 13
// strlen says: 5
#include <iostream>
#include <cstring>
#include <string>
int main() {
std::string str = "Hello, world!";
str[5] = 0;
std::cout << "string says its length is: " << str.length() << std::endl;
std::cout << "strlen says: " << strlen(str.c_str()) << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当然,没有str
注意到的写入操作导致"问题".但这不是我的问题.我想知道关于这种行为的标准.
每当一些表达可以函数模板被启用的未定义(例如,x
类型t
是不流传送的对std::cout
).就像是
template<typename t>
auto f(const t &x)
-> typename enable_if_undefined<decltype(std::cout << x)>::type;
Run Code Online (Sandbox Code Playgroud)
使用SFINAE,我只看到如果定义表达式时如何启用,但是如果表达式未定义则不知道如何执行.
假设A
源自B
. B *x = new A()
例如,是否有一种方法可以通过进行必要的显式强制转换来禁止像 中那样的隐式向上强制转换?
假设foo
是一个采用容器类型的模板,它本身有一个模板参数来指定其值的类型:
template <template<typename val_t> class container_t>
struct foo;
Run Code Online (Sandbox Code Playgroud)
为方便起见,foo
应std::vector
作为默认容器。问题是std::vector
形式上有两个参数,其中第二个有默认值。这意味着... container = std::vector
不起作用。
C++11 的解决方案是定义模板别名:
template<typename val_t> using vec_dummy = std::vector<val_t>;
template <template<typename val_t> class container_t = vec_dummy>
struct foo;
Run Code Online (Sandbox Code Playgroud)
我不喜欢,为了可读性(你必须搜索vec_dummy
)和审美原因(没有理由命名那种类型)。
有没有办法以某种方式匿名定义模板别名?其他解决问题的方法当然也受到热烈欢迎。
PS:实际上,foo
使用内部数据类型作为提供的容器的值类型,所以
template <typename container_t = std::vector<int>> struct foo;
Run Code Online (Sandbox Code Playgroud)
不是一个选择。