std::transform(myv1.begin(), myv1.end(), myv1.begin(),
[](double d) -> double { return d * 3; });
Если я правильно понимаю ваш вопрос, вы спрашиваете, как вы можете написать переменную изнутри анонимного класса.
Анонимные классы могут получить доступ только к конечным переменным и могут ' t напрямую "записывать" их.
Простое решение, которое "достаточно хорошо", - это создать своего рода класс ValueBox с одним полем значения и геттером и сеттером. Затем вы можете создать новый экземпляр в функции как конечную переменную и получить к ней доступ анонимному классу. Анонимный класс будет использовать свои методы получения и установки для записи / чтения.
Тот факт, что переменная является final, означает, что вы не можете направить ссылку куда-либо еще, но вы все равно можете изменить содержимое указанного объекта из любого функция.
Более серьезная проблема, с которой вы столкнетесь, - это ожидание вызова обратного вызова. Такой вид ожидания-сна может быть достаточно хорошим, но вы можете рассмотреть таймауты, потоки и т. Д., В зависимости от того, чего вы пытаетесь достичь.
Кроме того, все это предполагает, что вы никогда не собираетесь называть это дважды по подключению. В противном случае вам необходимо предоставить нам дополнительную информацию о вашей модели синхронизации.
Вот пример кода:
public int getUserid(String username) {
final ValueBox<Integer> userid = new ValueBox<Integer>();
connection.call("getUserid", new Responder() {
public void onResult(final int result) {
System.out.println("userid: " + result);
userId.setValue(result);
//how to assign received value to userid and return it?
}
}, username);
//wait for response
while (userid.isEmpty()) {
try{
Thread.sleep(100);
} catch (Exception e) {}
}
return userid.getValue();
}
Самым простым изменением является использование чего-то вроде java. util.concurrent.SynchronousQueue
. Но, возможно, вы захотите самостоятельно создать интерфейс, управляемый событиями.