Рассмотрим этот шаблонКак обеспечить, чтобы тип функции, переданный как аргумент шаблона, не изменял аргументы?
template<typename FunctionType>
void foo(FunctionType && function)
{
Bar b;
bar.mutateState();
function(bar);
}
Я хочу, чтобы убедиться, что function
не мутировать bar
. Не следует компилировать следующее.
foo([](Bar &){});
Однако обе эти строки должны быть скомпилированы.
foo([](const Bar &){});
foo([](Bar){});
Какие методы могут быть использованы? Упрощение лучше, но я бы предпочел интроспекцию типа шаблона над std::function
или сигнатурой указателя функции.
Это хорошая альтернатива, если вы хотите, чтобы требование было максимально приближенным к объявлению функции, а не похоронить его в реализации, где оно может потеряться или случайно удалено. – Mankarse