在继承中解包
Ts
会为模板成员函数 void bar()
添加额外的缩进。我怎样才能摆脱多余的缩进?
template <typename ...Ts>
struct Foo: public Ts...
{
Foo()
{
}
template <typename U>
void bar()
{
}
};
非解包继承效果很好:
template <typename T, typename U>
struct Foo: public T, public U
{
Foo()
{
}
template <typename S>
void bar()
{
}
};
我的
.emacs
:
; Replace highlighted text
(delete-selection-mode 1)
(defun bb-cpp-style()
(c-set-style "linux")
(setq indent-tabs-mode nil)
(setq tab-width 4)
(setq c-basic-offset 4)
(c-set-offset 'case-label '+)
(c-set-offset 'statement-case-intro '+)
(c-set-offset 'statement-case-open '0)
(c-set-offset 'inlambda 'c-lineup-inexpr-block) ;
(c-set-offset 'inline-open '0) ;
)
(add-hook 'c++-mode-hook 'bb-cpp-style)
; treat .h as c++
(add-to-list 'auto-mode-alist '("\\.h\\'" . c++-mode))
预计:
template <typename ...Ts>
struct Foo: public Ts...
{
Foo()
{
}
template <typename U>
void bar()
{
}
};
与违规行相关的 cc 模式语法元素是
statement-cont
。您可以使用函数 c-show-syntactic-information
和 c-syntactic-information-on-region
查看语法信息。也许这些元素的解析方式存在一些问题,因为在您的两个版本的代码中该行被赋予了不同的语法名称 - 我不知道。
您可以尝试为
statement-cont
添加自定义缩进规则,即当它不是作业时,不要向 statement-cont
添加任何缩进。这很简单:
(defun my-lineup-statement (langelem)
(or (c-lineup-assignments langelem) 0))
并在缓冲区中调用
(c-set-offset 'statement-cont #'my-lineup-statement)
进行测试(或将其添加到模式挂钩中)。这应该可以修复您所显示的情况下的缩进。
我在几个文件上进行了简短的测试,我注意到这一更改的唯一副作用是它删除了裸露的
=
后面的连续语句的缩进,如
int x =
1; // before adding 'my-lineup-assignments this usually indented (depending on chosen c style)
在其他情况下,您可能希望
statement-cont
元素缩进。