Вопрос на самом деле не имеет смысла.
Я знаю, что можно преобразовать std::function<void(string, string)>
в std::function<void()>
, когда аргументы указаны при компиляции;но возможно ли это, когда аргументы передаются во время выполнения?
Если вы говорите об этом, чтобы установить аргументы "при компиляции":
string arg1,arg2;
function<void()> f = bind(f1,arg1,arg2); // f = [=] { f1(arg1,arg2); };
это фактически делаетпривязка во время выполнения.Независимо от того, какое значение имеют эти аргументы при вызове bind, даже если они установлены во время выполнения, скажем, из пользовательского ввода, вызывающий f()
будет использовать эти значения времени выполнения.
Возможно, вы имеете в виду, что приведенный выше код связывает f1
до значений arg1
и arg2
во время вызова привязки, и то, что изменение значений объектов, используемых в bind
позже, не влияет на значения, используемые в вызовах f()
.Есть способ обойти это:
string arg1,arg2;
function<void()> f =
bind(f1,std::ref(arg1),std::ref(arg2)); // f = [&,f1] { f1(arg1,arg2); };
Это заставляет f хранить ссылки на объекты, а не только статическое значение, используемое во время вызова bind
.Теперь вы можете назначать новые значения arg1
и arg2
, и когда вызывается f()
, будут использоваться новые значения.Обратите внимание, что вы должны убедиться, что ссылки, хранящиеся в f
, остаются действительными и не становятся висячими ссылками, пока можно вызывать f
.
function<void(string)> foo = [](string s){ cout << s; };
string arg = "Hello,";
function<void()> bar = bind(foo,ref(arg)); // bar = [=,&arg] { foo(arg); };
bar(); // prints "Hello,"
arg = " World!"
bar(); // prints " World!"