Просто добавьте что-то примечательное здесь.
myQueue.hpp:
template <class T>
class QueueA {
int size;
...
public:
template <class T> T dequeue() {
// implementation here
}
bool isEmpty();
...
}
myQueue можно определить методы шаблонного класса, которые просто прекрасны в файле реализации. cpp:
// implementation of regular methods goes like this:
template <class T> bool QueueA<T>::isEmpty() {
return this->size == 0;
}
main()
{
QueueA<char> Q;
...
}
Нет, это небезопасно. Вы пытаетесь ввести изменяемое сглаживание внутри рукава матча. Измененная ссылка a
указывает на то же значение, что и self
. Можно было бы изменить self
(например, *self = Foo::Foo1(99)
), который затем аннулирует a
, поэтому этот код не разрешен.
Вместо этого mutably reborrow self
в выражении match
и вернуть ему первое значение кортежа. Так как это значение не имеет ссылки на self
, вы можете вернуть self
с результатом match
:
enum Foo {
Foo1(u32),
Foo2(u32), // changed so I don't have to figure out what casting you meant
}
impl Foo {
fn bar(&mut self, y: u32) -> (u32, &mut Foo) {
let next = match (&mut *self, y) {
(Foo::Foo1(a), b @ 5) => {
*a = b + 42;
b
}
(Foo::Foo2(a), b @ 5) => {
*a = b + 42;
*a * b
}
_ => y,
};
(next, self)
}
}
Однако возврат self
, как это, скорее здесь бессмысленно. У вызывающего уже есть &mut Foo
, поэтому вам не нужно «возвращать его». Это позволяет упростить:
impl Foo {
fn bar(&mut self, y: u32) -> u32 {
match (self, y) {
(Foo::Foo1(a), b @ 5) => {
*a = b + 42;
b
}
(Foo::Foo2(a), b @ 5) => {
*a = b + 42;
*a * b
}
_ => y,
}
}
}
Я бы сказал, что это безопасная операция, хотя компилятор, возможно, не сможет понять, что
С неэлексические времена жизни , средство проверки займов становится более интеллектуальным. Ваш исходный код с добавленным явным компилятором reborrow:
#![feature(nll)] enum Foo { Foo1(u32), Foo2(u32), // changed so I don't have to figure out what casting you meant } impl Foo { fn bar(&mut self, y: u32) -> (u32, &mut Foo) { match (&mut *self, y) { (Foo::Foo1(a), b @ 5) => { *a = b + 42; (b, self) } (Foo::Foo2(a), b @ 5) => { *a = b + 42; (*a * b, self) } _ => (y, self), } } }
См. Также:
- Почему соответствие по кортежу разыменованных ссылок не работает во время разыменования, -tuples does?
- Каков синтаксис для сопоставления ссылки на перечисление?
- Как использовать совпадение на пару заемных значений без их копирования?
- Есть ли разница между сопоставлением по ссылке на шаблон или разыменованным значением?