I think what I am after doing may not be possible? hopefully it is as it could save me a load of hassle 
I have a custom Game Instance blueprint object, and throughout the code are various calls that Get the Game Instance and then cast it to the custom variant of it so that the extra flavour can be accessed.
My hope was to remove all these BP calls with a single C++ function, but I cannot wrap my head around how to craft a C++ function with a return type that is a Blueprint class type, I am starting to think it may not be possible?
Any help much appreciated.
You can’t, or rether you can but you will need to reduce to most common type declared in C++. Blueprints run on virtual machine and as name suggests they virtual, they don’t exist during compilation process so they cna not be used directly in C++.
You can interact with Blueprint code via reflection system, getting UFunctions, UProperty of individual elements of blueprint class and you can do this by accessing UClass of blueprint class (which you may also know as TSubclassOf which is template of UClass)
You can do call on UFunction usiinbg PRocessEvent function:
You can also access function by name:
But ultimately, anything that will be used in C++ should be declared in C++, thats best practice, so you don’t need to do all those weird things. So delere base classes for blueprints and things like structs and enums in C++ instead of blueprints and assets. Structure and Enum assets exist only for blueprint only users, as they have no other means to declare them without touching C++.
Agreed, this is how I would have done it. Was hoping there was some secret sauce that I hadn’t heard of to have a return type same as BP. Was hoping there may have been a quick win to save me having to refactor 100’s of variables into a C++ base class and then hunt them down in the BP code.
If only 
There is theoretical possibility via blueprint nativisation, problem it is C++ code is generated in packaging only, so it’s not accessible in editor if accessible at all