class_docstr: Generalized function class.
  
  .. seealso:: :class:`numpy.vectorize`
code: def _get_body(return_type, call):
      if isinstance(return_type, _cuda_types.Scalar):
          dtypes = [return_type.dtype]
          code = f"out0 = {call};"
      elif isinstance(return_type, _cuda_types.Tuple):
          dtypes = []
          code = f"auto out = {call};\n"
          for i, t in enumerate(return_type.types):
              if not isinstance(t, _cuda_types.Scalar):
                  raise TypeError(f"Invalid return type: {return_type}")
              dtypes.append(t.dtype)
              # STD is defined in carray.cuh
              code += f"out{i} = STD::get<{i}>(out);\n"
      else:
          raise TypeError(f"Invalid return type: {return_type}")
  
      out_params = [f"{dtype} out{i}" for i, dtype in enumerate(dtypes)]
      return ", ".join(out_params), code
  
file_path: cupy/cupy/_functional/vectorize.py
imports: import numpy
  from cupy import _core
  from cupyx.jit import _interface
  from cupyx.jit import _cuda_types
label_desc: Use image node_id 2 for calling the vectorize obj's underlying member method code with example usage: obj._get_body(return_type, call) and returns: str,  code