Couple questions about types and casting:

I have a function for the Math library that accepts two arguments. I want those arguments to be limited to:

```
int, double,
double, double
double, var
var, var
double, fvar<var>
fvar<var>, fvar<var>
double, fvar<fvar<var>>
fvar<fvar<var>>, fvar<fvar<var>>
```

(all the autodiff types and mixes of types a Stan model might need to use)

What I ended up hacking together was:

`typename boost::disable_if_c<is_vector_like<T1>::value || is_vector_like<T2>::value, myReturnType >::type`

Is there any standard way of doing this? I saw `is_var_or_arithmetic`

(https://github.com/stan-dev/math/blob/develop/stan/math/prim/scal/meta/is_var_or_arithmetic.hpp) but when I tried it (if I didn’t mess anything up) that would accept Eigen::Matrixes (Eigen::Matrices? Eigen::Matrixs?..)

What I want to avoid are Eigen::Matrixes and std::vectors leaking in as my T1s and T2s.

The other thing I wanted to know is if I have Eigen::Matrices of things I want to cast to other things (so like `Eigen::Matrix<double> to Eigen::Matrix<var>`

).

I ended up using:

`m.template cast<typename return_type<T1, T2>::type>()`

Where `m`

is being cast from one type to another. The issue I think with this is that it might allow casts in the wrong direction (vars to doubles instead of doubles to vars?). I’m honestly not 100% sure. Any preferred way to do this higher level cast? I assume internally Eigen’s cast is just using whatever copy constructors are available to it, but I’m not sure.