Я думаю, что это будет работать:
template<typename T>
template<typename... Args>
void InitToRandomValues(vector<T>* retval, int n, RNG& rng, Args const&... args) {
retval->resize(n);
std::generate(retval->begin(), retval->end(), [] -> T() {
typename T::CPDDist cpd(rng, args...);
return T(cpd); });
}
Хотя это не слишком упрощение.