Есть ли чистый способ сопоставить шаблон с lvalue или значением, но не с rvalue?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Есть ли чистый способ сопоставить шаблон с lvalue или значением, но не с rvalue?

Сообщение Anonymous »

На данный момент лучшее, что я придумал, — это функция-обертка для каждой функции, например:

Код: Выделить всё

template
coro operator+(A && a, B && b)
{
return [] (A a, B b) -> coro {
var y {a.value() + b.value()};
co_yield y;
a.backward(y.grad());
b.backward(y.grad());
}(std::forward(a), std::forward(b));
}

// OR (since I'm not using initial_suspend)

template
coro operator+(A && _a, B && _b)
{
A a = std::forward(_a);
B b = std::forward(_b);
var y {a.value() + b.value()};
co_yield y;
a.backward(y.grad());
b.backward(y.grad());
}
но такое раздувание раздражает, особенно если учесть, что таких функций может быть сотня.
Для большего контекста цель — поддержка выражений с временными объектами, например a + b + c, но для захвата временных объектов по значению, чтобы они не висели в сопрограммах. Однако выражения со ссылками lvalue должны не копировать данные, поскольку
они являются узлами в группе обеспечения доступности баз данных, потенциально с другими ссылками.
Я надеюсь есть просто какой-то хитрый трюк с выводом шаблонов или разрешением перегрузок, который может творить всю магию в одном месте, поэтому каждая из моих функций сопрограммы становится тоньше.
Жаль, что сопрограммы C++ этого не делают. предложите некоторую возможность настройки или что-то, что позволяет вам указать состоянию сопрограммы захватывать аргументы rvalue по значению.

Подробнее здесь: https://stackoverflow.com/questions/791 ... not-rvalue
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»