Если у вас есть адаптер итератора, то вам обычно требуется два таких объекта.
И если у вас много таких алгоритмов, то имеет смысл спрятать вектор внутри другого класса, чей метод begin / end вместо этого возвращает адаптеры.Что-то более или менее подобное:
templace <std::size_t D> class MyContainer
{
public:
MyAdaptor<D> begin();
MyAdaptor<D> end();
private:
std::vector<GenericWidgetData<D>> data;
};
Однако, возможно, имеет смысл просто добавить соответствующие функции в GenericWidgetData
.В этом случае вам может потребоваться некоторая специализация, чтобы, например, b()
был доступен только при размере 2 или более и т. Д.
Тем не менее, лучшим решением, вероятно, было бы изменение 1000 функций таким образом, чтобывместо прямого доступа к членам LegacyWidgetData
, тогда будет вызываться свободная функция.
double& b(LegacyWidgetData &data) { return data.b(); }
const double& b(const LegacyWidgetData &data) { return data.b(); }
И тогда вы добавите перегрузки для GenericWidgetData в зависимости от ситуации.Использование static_assert
для проверки может работать относительно хорошо в этом случае:
template <std::size_t D> double& b(GenericWidgetData<D> &widgetData)
{
static_assert(D > 1, "b is available only if D is big enough");
return widgetData.data[D]; // Or an accessor function to avoid making it public
}
Затем вы добавили бы также вариант const
.
Это больше работает, но более гибко.Например, вы можете правильно проверить размерность для каждой функции.
В качестве альтернативы, другое решение состоит в том, чтобы добавить дополнительные параметры в ваш алгоритм для применения преобразования.
template <typename Iterator, typename FA, typename FB>
void dummyFunction(Iterator begin, Iterator end, FA fa, FB fb)
{
for (auto it = begin; it != end; it++)
{
cout << "Before: " << fa(*it) << "," << fb(*it) << "\t";
fa(*it) += 1;
fa(*it) -= 1;
cout << "After: " << fa(*it) << "," << fb(*it) << "\n";
}
}
Это может показатьсямного работы, но тогда вы очень гибкий.Поэтому, возможно, вы можете пересмотреть, какой код вы хотите изменить.
Возможно, было бы лучше сделать такое изменение сейчас и иметь более чистый код в будущем, чем создавать адаптер или добавлять множество функций к GenericWidgetData
, которые предназначены для использования только алгоритмами.