Mathematica has a built-in function for applying a specific head in an expression. Both of these are (almost) equivalent:
Apply[List, expr]
List@@expr
Apply replaces a head(s) in an expression with the specified head. The default levelspec is {0}, meaning it only applies to the top level (the Head of expr itself) when you don't specify anything else.

When using the curried form (List@@expr), expr is evaluated before applying your specified head. Parentheses help protect you from this.

Alternatively, be certain what you're applying your head to, you could Defer evaluation, but then you need use the curried form of MapApply (@@@) to Apply List to the expression inside Defer, not to Defer itself.

Extracting Only Addition Terms
It's easy to use Apply to replace Plus with List when it's the level 0 head. There's a bit of challenge preventing evaluation of the expression (possibly replacing Plus with a result) is a minor challenge. Handling the monomials is a larger challenge.
- If the head is
Plus, you want it replaced with List
- If the head is not
Plus, you want to wrap List around the expression
It took quite a bit of debugging, but the solution is to wrap everything in List, then if Plus is the unevaluated head, replace it with Sequence.
You need both these lines to make it work.
SetAttributes[terms, HoldAll]
terms[expr_] := {ReleaseHold[Apply[Replace[Extract[Hold[expr], {1, 0}], Plus -> Sequence], Hold[expr], {1}]]}
Examples
The FullForm column shows that there aren't any spare Hold, Defer, or Unevaluated floating around.
