I’ve tried:
GetWorldSettings()->GetMyVar()
GetWorld()->GetWorldSettings()->GetMyVar()
//both return C2039: 'GetMyVar' : is not a member of 'AWorldSettings'
GetWorldSettings<AMyWorldSettings>()->GetMyVar()
GetWorld()->GetWorldSettings<AMyWorldSettings>()->GetMyVar()
//both return C2275: 'AMyWorldSettings' : illegal use of this type as an expression
but none of them work.
GetWorldSettings() returns a pointer to AWorldSettings, not AMyWorldSettings, which is why the first attempt fails. Your second attempt fails because GetWorldSettings() is not a template function, so your syntax is illegal.
A working approach in this case would be to down cast the pointer you’re getting from GetWorldSettings():
Cast<AMyWorldSettings>(GetWorld()->GetWorldSettings())->GetMyVar();
Yup, that does the trick!
I assume I can cast anything with that syntax?
You can use Cast<> to cast anything that is or derives from UObject.
For normal C++ types you can use the standard casting templates.