Given:
class Incomplete; // no definition
class Complete { int a; } // has definition
I need a way to statically determine that "Incomplete" is not defined, i.e. I want something like:
is_incomplete_v<Incomplete> // evaluates to true
is_incomplete_v<Complete> // evaluates to false
This isn't possible.
If the result of a template instantiation would differ at a few spots in a program, you get undefined behavior. These spots include the same template in different compilation units, at the end of the current compilation unit, and at the point where you instantiate the template.
Between the three, any technique that could detect if the type is incomplete would be undefined-behavior-bait, because if the type later becomes complete or it is used in a context where the type is already complete, it is illegal under the C++ standard.
Now, in theory, some technique could exist that would return a value for a class that is never completed anywhere, and distinguish that from another class which is defined before it is ever examined. But any such technique's failure mode would be an ill-formed program, so even then I wouldn't use it.
Unless the C++ standard gives us a direct technique to do this, I wouldn't try to do it either.
Generally, C++ wants compile time template constructs to be memoizable - that their name (including arguments) is sufficient to describe what they are. So any attempt to use templates to do this is going to go against that preference, which C++ will feel free to change the rules to enforce.