Suppose I have a Python function Foo() that I'm auto-generating to C++ with SymForce's codegen functionality. It's a complicated function with a lot of parameters, so I want to pass in a Params struct instead of 20+ individual scalar arguments. I would further like to use the existing Params struct in use by the rest of the codebase instead of copying data to the auto-generated SymForce struct. The Code generation using implicit functions in the Codegen Tutorial seems to be fairly close to what I want for part (1) of this question, but if you look at the generated types in double_pendulum.lcm, everything is using double which could be a dealbreaker if I can't replace the type. Speaking of which, it's not clear how to change out this type for my user defined Params struct. Playing around a bit, I'm able to get similar results with toy problems such as: @dataclasses.dataclass class Params: a: np.float32 # Single precision is not respected. b: np.float32 def foo(params: Params): return params.a ...which auto-generates the following: struct params_t { double a; double b; } // ... template <typename Scalar> Scalar Foo(const foo:arams_t& params) { // ... Scalar _res; _res = params.a; return _res; } // NOLINT(readability/fn_size) Again, there's not an obvious way to replace params_t and, giving up on wholesale type replacement, there's not an obvious way to change the type of fields from double to float. The Generating from a Python function example is able to map the sf.Pose3 type to the templated C++ type sym:ose3<Scalar>, so there's clearly a way to do this, but it appears to involve deeper spelunking into the source code. Continue reading...