Is the visitor really necessary? Consider this:
template<typename T>
T value_get(Value_T const &c_variant) {
return T();
}
template<>
int value_get<int>(Value_T const &c_variant) {
return c_variant.i;
}
template<>
const char* value_get<const char*>(Value_T const &c_variant) {
return c_variant.s;
}
template<typename T>
std::vector<T> fill_vector(ValueContainer_T const& c_container) {
std::vector<T> cpp_container(c_container.numberOfValues);
for(size_t i = 0; i < c_container.numberOfValues; ++i)
cpp_container[i] = value_get<T>(c_container.values[i]);
return cpp_container;
}
Looks simpler to me.