У меня есть класс, который автоматически интерполирует 2D-функцию (вполне доволен этим). Он принимает динамический указатель на функцию для интерполируемого метода. Мне пришлось шаблонизировать класс, так как мне нужен экземпляр объекта, а также указатель.
Могу ли я избежать шаблонного урока? Или мне нужно будет продолжать делать это, чтобы принять экземпляр объекта в качестве параметра? Возможен ли базовый класс? (Я довольно новичок в C ++)
То, как у меня это (сокращенно):
template<class F>
class Interpolate {
Interpolate(double (F::*f)(double, double), F & obj, ...) {
...
double value = (object.*f)(x,y);
...
}
}
Как указано в комментарии, вы также можете использовать std :: function. Это даст вам больше гибкости с помощью std :: bind. С другой стороны, std :: function может разместить результирующую функцию в куче, и это вызывает большие накладные расходы (чего можно избежать, используя std :: cref ()). Очень интересное обсуждение различий во времени выполнения шаблонов std :: function и шаблонов можно найти по адресу std :: function vs template.
«Обратите внимание, что std :: function может хранить различные типы вызываемых объектов. Следовательно, он должен выполнить магию стирания типа для хранилища. Как правило, это подразумевает динамическое выделение памяти (по умолчанию через вызов new). Общеизвестно, что это довольно дорогостоящая операция ». Кассио Нери. Здесь может помочь std :: cref, особенно потому, что в примере, который я только что написал по ссылке, без std :: cref, выделение кучи std: : функция замедлила программу в 10 раз!
Других решений пока нет …