You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Emacs中可变参数类型继承致模板成员函数缩进异常的解决方法

Emacs C++可变参数模板继承时成员函数缩进异常的解决方法

问题描述

当结构体继承可变参数模板类型(public Ts...)时,类内的模板成员函数会出现多余缩进;采用非可变参数的多继承(public T, public U)时,缩进表现正常。

现有配置

; 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()
    {
    }
};

正常代码示例(非可变参数继承)

template <typename T, typename U>
struct Foo: public T, public U
{
    Foo()
    {
    }

    template <typename S>
    void bar()
    {
    }
};

期望缩进效果

template <typename ...Ts>
struct Foo: public Ts...
{
    Foo()
    {
    }

    template <typename U>
    void bar()
    {
    }
};

解决方法

在你的bb-cpp-style函数中添加一行配置,强制继承列表的延续行缩进为0,避免Emacs将后续的模板成员函数误识别为继承列表的一部分:

(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)
  
  ; 新增:修正可变参数模板继承后的缩进问题
  (c-set-offset 'inher-cont '0)
)

修改后重新加载Emacs配置(M-x eval-buffer),再重新缩进代码(C-M-\),即可得到期望的缩进效果。

内容的提问来源于stack exchange,提问作者bbalazs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 11:44:50