У меня есть различные классы в среде C ++ 0x, и я хотел бы написать функции для преобразования между некоторыми из них.Например:
struct Foo { float v; };
struct Bar { int i; };
struct Tar { float p, q; };
void Convert(const Foo& x, Bar& y) { y.i = static_cast<int>(x.v); }
void Convert(const Tar& x, Foo& y) { y.v = x.p + x.q; }
Это только пример.Здесь довольно много «маленьких» классов.И не все функции преобразования имеют смысл.
Кроме того, есть некоторые классы, которые по сути ведут себя как контейнеры STL и должны «наследовать» эти функции преобразования.
void Convert(const std::vector<Foo>& cx, std::vector<Bar>& cy) { ... }
void Convert(const std::vector<Tar>& cx, std::vector<Bar>& cy) { ... }
Нет, я ищу простойспособ определения этих функций.Я попытался:
template<typename X, typename Y>
void Convert(const std::vector<X>& cx, std::vector<Y>& cy) {
cy.resize(cx.size());
for(std::size_t i=0; i<cx.size(); i++) {
Convert(cx[i], cy[i]);
}
}
, и это прекрасно работает.
Однако при такой настройке нужно написать
std::vector<X> cx = { ... };
std::vector<Y> cy;
Convert(cx, cy);
// when not specifying the type, one needs to use this form f(X, &Y)
При такой настройке, как
template<typename X, typename Y>
std::vector<Y> Convert(const std::vector<X>& cx) {
std::vector<Y> cy(cx.size());
for(std::size_t i=0; i<cx.size(); i++) {
cy[i] = Convert(cx[i]);
}
return cy;
}
нужно написать
std::vector<X> cx = { ... };
std::vector<Y> cy = Convert<X,Y>(cx);
// can I avoid specifying the source type with this form?
Конечно, в какой-то момент необходимо упомянуть тип цели, но тип источника определяется параметром функции.Я не хочу упоминать это снова и снова.
Существует ли элегантный общий способ обработки таких функций преобразования?
Отредактировал вопрос для уточнения