Это Undefined behavior, конечно. Пока луна не в скорпионе, оно даже может работать, потому что расположение в памяти Time и double одинаковое, и вроде как даже vector для этих двух типов будут в памяти одинаковы.
Тут проблема даже не reinterpret_cast, кастовать-то
можно: пункт 6, а потом пункт 5.
Обращаться к этому потом
нельзя.
Тут нарушение strict aliasing. Нельзя к данным
vector<Time> обращаться через указатель на
vector<double>. Компилятор в праве посчитать, что вы к вектору v вообще не обращаетесь нигде и оптимизировать его нафиг из программы и памяти.
Раз расположение в памяти идентичное, вы можете выделить вектор Time нужного размера и скопировать туда данные через memcpy:
memcpy(&t[0], &v[0], sizeof(double)*v.size());
Или напишите свою функцию в виде шаблона.
template <typename T>
std::vector<T>Interpolate(vector<T> data) {
// ...
}
Тогда она может и double и Time принимать без проблем.
Или напишите конструкторы для Time, И можно его инициализировать через список инициализации:
struct Time {
Time() : x(0) {}
Time(double a) : x(a) {}
double x;
};
std::vector<Time> v = {1,2,3};
С такими конструкторами можно даже скопировать
vector<double> в
vector<Time>:
std::copy(a.begin(), a.end(), std::back_inserter(v));
Edit: ну, и наоборот, если вы хотите из вектора Time получить вектор double, вы должны определить
operator double() у вашего Time. И оттуда уже можно будет копировать в дабловый вектор. И работать это будет даже если класс Time содержит еще чего-то кроме double.