Вы не должны наследовать от std::function
.
Вместо этого вы используете абстракцию базового вида функционального объекта, например:
void DoSomething(function<void(const string&, const string&) myF)
{
string s1, s2;
myF(s1, s2);
}
// usage:
DoSomething(bind(otheFunc, ....));
DoSomething([](const string& s1, const string& s2) { ... });
struct Func
{
operator()(const string& s1, const string& s2)
{ ... }
}
Func f;
DoSomething(f);
Теперь, чтобы ответить на ваш вопрос, если вы используете const string&
, вы просите компилятор не копироватьвозражать и запрещать модификации.Этот выбор зависит от значения, которое вы придаете своим параметрам.
Для небольших типов, таких как числа и небольшая структура, передайте копию.
Если вы не хотите выполнять очень сложные оптимизации копирования / перемещения,вам лучше всегда использовать const&
для крупных типов.Я бы рассмотрел string
большой тип, если вы не уверены, что он никогда не будет расти.