Одна из основных целей — использовать полиморфизм во время выполнения, чтобы позволить пользователям расширять или переписывать функции библиотеки по умолчанию для своих собственных сценариев использования. Основная проблема заключается в том, что мне нужна иерархия полиморфизма, как в (сильно упрощенном) текущем дизайне ниже:
Код: Выделить всё
class SettingsBase
{
virtual OutType compute(InType var) = 0; // MODIFIES the object
};
class FeatureBase
{
virtual OutType compute(InType var) = 0;
};
class FeatureDefaultImpl: public FeatureBase
{
OutType compute(InType var) override
{
OutType settings_output = settings_->compute(some_var); // modifies settings_
// use settings_output in the remaining computations
}
// I want the settings themselves to be polymorphic in case the user wants to use
// FeatureDefaultImpl with their own settings class. So I use a constructor to pass
// in the settings.
template
FeatureDefaultImpl(SettingsType& settings):
settings_(std::make_shared (settings)) {};
private:
std::shared_ptr settings_;
}
Код: Выделить всё
OutType compute(InType var, SettingsBase& settings) override
НО теперь я хочу сделать следующее:
Код: Выделить всё
void loop_function(FeatureDefaultImpl impl, int large_number)
{
#pragma omp parallel for firstprivate(impl)
for (int i = 0; i < large_number; ++i)
{
InType var; // = something
OutType output = impl.compute(var);
// store output in a matrix
}
}
Одно из решений, которое пришло мне в голову, — это определить мои собственные конструкторы перемещения и копирования, которые гарантируют, что settings_ всегда будет глубоко скопировано, но в библиотеке много таких базовых классов, и мне кажется немного неуклюжим добавлять весь дополнительный шаблонный код.
Другое решение: вместо этого просто сделать
Код: Выделить всё
template
class FeatureDefaultImpl: public BaseFeatureA
{
OutType compute(InType var) override
{
OutType settings_output = settings_.compute(some_var);
// use settings_output in the remaining computations
}
FeatureDefaultImpl(SettingsType& settings):
settings_(settings) {};
private:
SettingsBase settings_;
}
- Есть ли лучший способ добиться этих целей, чем варианты, которые я рассмотрел?
- Если нет, то какой вариант наименее плохой с точки зрения передовой практики? То есть чем стоит пожертвовать?
Подробнее здесь: https://stackoverflow.com/questions/798 ... -and-openm
Мобильная версия