Я унаследовал кучу сетевого кода, который определил множество типов пакетов. Я должен написать набор функций преобразования, которые принимают структуры определенного типа, и копируют значения в другие структуры, которые имеют те же поля, но в другом порядке (как часть замысловатой операции преобразования порядка битов в частичной платформе - don не спрашивайте) Кроме того, я знаю, что могут быть лучшие способы выразить конверсию и т. Д. Ниже, но в данный момент меня это не касается. В частности, я не могу заставить преобразование принимать его выходную переменную по ссылке, потому что я буду передавать битовые поля, и это приведет к ошибке компилятора.
Итак, есть несколько таких структур:
struct foo {
int bar;
int baz;
};
struct foo_x86 {
int baz;
int bar;
};
И несколько таких функций для преобразования между ними:
foo_x86 convert (const foo & in) {
foo_x86 out;
out.bar = in.bar;
out.baz = in.baz;
возвращаться;
}
В этом нет ничего страшного. У меня проблема в следующем: есть также структура шаблона, которая выглядит примерно так:
template <class T>
struct Packet {
HeaderType head;
T data;
};
Существует несколько экземпляров этого шаблона, использующих указанные выше типы пакетов в качестве параметров шаблона, например:
struct superfoo {
Packet<foo> quux;
};
struct superfoo_x86 {
Packet<foo_x86> quux;
};
Теперь, предполагая, что существует функция
foo_x86 convert (const foo &);
Есть ли способ создать шаблонную функцию для обработки объектов Packet, которая вызывает эту функцию преобразования?
Например, я хочу что-то, похожее на это:
template <class type_1, class type_2>
Packet<type_2> convert(const Packet<type_1>& in) {
Packet<type_2> out;
out.head = in.head;
out.data = convert(in.data);
return out;
}
Это будет работать в такой функции, как:
superfoo_x86 convert(const superfoo& in) {
superfoo_x86 out;
out.quux = convert(in.quux);
return out;
}
Я хочу иметь возможность преобразовывать объекты Packet, не обращая внимания на то, с каким типом они создаются, и я хочу избежать необходимости объявлять отдельные функции преобразования для каждого возможного создания экземпляров Packet.
Есть ли какое-либо отношение к шаблонам в C ++?