It's not possible for an LR(1) parser to solve this problem without using the Lexer Hack: information from the symbol table, which is able to differentiate type names from variable names, is reported to the parser using two different token kinds for "identifier". The impossibility stems from the grammar being otherwise ambiguous, as shown by the example from the linked Wikipedia article, (A)*B, which can be either a cast of a pointer dereference (if A is a type) or a multiplication with redundant grouping parentheses around the first operand (if A is a variable).
The Wikipedia article goes on to claim that Clang does not use the Lexer Hack, although I see this as a technicality: the Clang parser (which is a hand-written, recursive descent parser, not LR(1) table-driven) gets identifier disambiguation information before deciding what to do, but via a separate semantic analysis query instead of using two distinct token kinds. It's the same information, for the same purpose, just delivered via an adjacent channel.
In a comment on another answer, Ben suggests parsing without (at first) fully disambiguating. Due to the aforementioned ambiguity (among others), this is not possible when using an LR(1) parser (you'd get unresolvable shift/reduce conflicts). However, a Generalized LR algorithm can be used instead, which in general yields an abstract syntax forest (which uses node sharing to avoid exponential blowup) rather than a syntax tree. My MS thesis, Elkhound, a Fast, Practical GLR Parser Generator, explored the feasibility of this approach for both C and C++. The resulting parser, called Elsa, could be regarded as a "generic parser [that handles] this without high-level information". (Beware: Elsa is relevant to this question as a proof of concept, but is very much a "fixer upper" for anyone trying to use it to parse real-world C/C++. Clang does that job much better.)