"auto"关键字:如何自定义?
"auto" keyword: How to customize it?
标题含糊不清,我知道。考虑一下:
template<typename T>
using Ref = std::shared_ptr<T>;
template<typename T>
using StrongRef = std::shared_ptr<T>&;
struct Person {
std::string m_name;
Person(const std::string& l_name) : m_name(l_name) {}
};
class Container{
Ref<Person> m_person;
public:
People(const std::string& l_name) {
m_person = std::make_shared<Person>(l_name);
}
~People() {}
StrongRef<Person> GetPerson() { return m_person; } //returning a ref to a shared
//pointer, so it doesn't increase the use_count
};
int main(){
Container container("Pedro");
/*Here lies my problem. The auto keyword is presuming a shared_ptr, not a shared_ptr&*/
auto person = container.GetPerson();
/*I want it auto keyword to be StrongRef<Person> not std::shared_ptr<Person>*/
}
有没有办法让我的 auto 关键字成为 StrongRef 而不是推导 std::shared_ptr?
你可以告诉auto
你想要一个像
这样的参考
auto& person = container.GetPerson();
这确实有一个缺点,虽然好像 GetPerson
按值更改为 return,然后您试图将左值引用绑定到右值,这将导致编译器错误。
要解决这个问题,您可以使用像
这样的转发引用
auto&& person = container.GetPerson();
现在,如果 container.GetPerson()
return 一个右值,person
将是一个右值引用,它将延长临时对象的生命周期以匹配 [=15= 的生命周期].
如果 container.GetPerson()
return 是左值,那么 person
将是对 returned 对象的普通旧左值引用,就像您使用 auto&
代替。
@NathanOliver 我是这样工作的:
而不是
template <typename T>
using StrongRef = std::shared_ptr<T>&;
我正在使用
template <typename T>
using StrongRef = std::shared_ptr<T>&&;
当我 return m_person 我只是把它投射到 StrongRef
StrongRef<Person> GetPerson() { return (StrongRef<Person>)m_person; }
现在我的 auto 关键字将成为对它的引用。因此,不增加计数:
int main() {
People people("Pedro");
auto person = people.GetPerson();
if (person) {
std::cout << person.use_count() << "\n"; //Remains 1
std::cout << person->m_name << "\n";
}
return 0;
}
标题含糊不清,我知道。考虑一下:
template<typename T>
using Ref = std::shared_ptr<T>;
template<typename T>
using StrongRef = std::shared_ptr<T>&;
struct Person {
std::string m_name;
Person(const std::string& l_name) : m_name(l_name) {}
};
class Container{
Ref<Person> m_person;
public:
People(const std::string& l_name) {
m_person = std::make_shared<Person>(l_name);
}
~People() {}
StrongRef<Person> GetPerson() { return m_person; } //returning a ref to a shared
//pointer, so it doesn't increase the use_count
};
int main(){
Container container("Pedro");
/*Here lies my problem. The auto keyword is presuming a shared_ptr, not a shared_ptr&*/
auto person = container.GetPerson();
/*I want it auto keyword to be StrongRef<Person> not std::shared_ptr<Person>*/
}
有没有办法让我的 auto 关键字成为 StrongRef 而不是推导 std::shared_ptr?
你可以告诉auto
你想要一个像
auto& person = container.GetPerson();
这确实有一个缺点,虽然好像 GetPerson
按值更改为 return,然后您试图将左值引用绑定到右值,这将导致编译器错误。
要解决这个问题,您可以使用像
这样的转发引用auto&& person = container.GetPerson();
现在,如果 container.GetPerson()
return 一个右值,person
将是一个右值引用,它将延长临时对象的生命周期以匹配 [=15= 的生命周期].
如果 container.GetPerson()
return 是左值,那么 person
将是对 returned 对象的普通旧左值引用,就像您使用 auto&
代替。
@NathanOliver 我是这样工作的:
而不是
template <typename T>
using StrongRef = std::shared_ptr<T>&;
我正在使用
template <typename T>
using StrongRef = std::shared_ptr<T>&&;
当我 return m_person 我只是把它投射到 StrongRef
StrongRef<Person> GetPerson() { return (StrongRef<Person>)m_person; }
现在我的 auto 关键字将成为对它的引用。因此,不增加计数:
int main() {
People people("Pedro");
auto person = people.GetPerson();
if (person) {
std::cout << person.use_count() << "\n"; //Remains 1
std::cout << person->m_name << "\n";
}
return 0;
}