The anim blueprint creates a subclass of UAnimInstance, which is placed on the USkeletalMeshComponent. You can play ‘one-off’ animations from C++ using AnimationData on the component without making an Anim Blueprint, but you won’t be blending between multiple animations in that way.
The system wasn’t really designed to build an animation blend tree entirely in C++, although it should be possible.
Note: This is theoretical, I’ve never tried to do this before, but it’s basically doing by hand what the anim blueprint compiler does.
Create a subclass of UAnimInstance, add whatever FAnimNode subclasses you want to it as member variables, and then override InitializeAnimation to wire up the pose links and set RootNode as desired. The rest of the code should ‘just work’ from that point.
If you’re just worried about C++ being able to control the direction of animation, there are a number of options. You can make your own UAnimInstance derived class that gathers parameters or chooses animations and make an anim blueprint based off of that, or you can do most things in the anim blueprint and still trigger override animations on specific slots in the tree using PlayAnimMontage or PlaySlotAnimation.