首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >"this“参数的包装类型

"this“参数的包装类型
EN

Stack Overflow用户
提问于 2022-03-07 16:33:32
回答 4查看 117关注 0票数 -1

铁锈相当于C++的thisself。在铁锈中,您可以这样做:

代码语言:javascript
运行
复制
struct C;

impl C {
    fn some_fn(self: &Rc<Self>) {}
}

这种特性是否存在于C++中?以下内容在语法上无效:

代码语言:javascript
运行
复制
class c_t {
    void some_fn(std::shared_ptr<c_t> this) {
        std::cout << "calling from shared_ptr";
    }
};

这样我就能做到:

代码语言:javascript
运行
复制
auto c = std::make_shared<c_t>();
c->some_fn(); // "calling from shared_ptr"

是的,c->some_fn()可以工作(C++取消引用),但是我想知道传递给some_fn()的指针--也就是说,我想知道什么指针是this

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2022-03-07 17:00:55

你不能

代码语言:javascript
运行
复制
shared_ptr<C> c = std::make_shared<C>();
c->foo(); // OK
c.get()->foo(); // Should not be OK.

你能做的最接近的事情是:

代码语言:javascript
运行
复制
class C {
public:
    friend void some_fn(std::shared_ptr<C> self) {
        // ...
    }
};

所以

代码语言:javascript
运行
复制
shared_ptr<C> c = std::make_shared<C>();
some_fn(c); // OK
some_fn(c.get()); // KO.
票数 1
EN

Stack Overflow用户

发布于 2022-03-07 17:01:20

这样我就可以做到:

auto c= std::shared_ptr(c_t());c->some();//“从shared_ptr调用”

您可以通过声明一个成员函数(也可以在某个地方定义它)来完成这项工作:

代码语言:javascript
运行
复制
struct c_t {
    void some_fn();
};

想知道传递给some_fn的shared_ptr指针

不,你不能用你想要的语法。使用operator->间接通过共享指针后,有关共享指针的信息已经丢失。非静态成员函数只知道对象的标识(通过隐式this),而不知道共享指针。

您可以将共享指针传递给非(非静态成员函数),即静态成员函数或空闲函数:

代码语言:javascript
运行
复制
void some_fn(const std::shared_ptr<c_t>& ptr);
// ...
some_fn(c);

如果类继承了std::enable_shared_from_this,非静态成员函数可以获取指向自身的共享指针,但很难正确使用,在这种情况下,对共享指针不属于的对象调用函数将导致未定义的行为。本质上,只有当实例的创建封装为只能创建共享实例时,才能安全地使用。

如果这些都不是您想要的,那么我想对“这种特性在C++中存在吗?”这个问题的答案是?是:不。

票数 1
EN

Stack Overflow用户

发布于 2022-03-07 17:04:09

首先,C++的this指针不是shared_ptr。通过使用std::enable_shared_from_this可以获得shared_ptr this,但通常不需要这样做(请不要这样做,除非您完全确定原因!)

c_t的任何非静态成员函数都可以访问c_t* this (如果成员函数是非const )和const c_t* this (如果该函数是const)。

不应将this作为类中任何成员函数的参数。this指针已经在每个非静态成员函数中隐式声明(如上面所述)。同样,在不使用some_fun指针的情况下调用this的唯一方法是使函数保持静态(因为开始时没有特定的实例)。

您不能在some_fun中知道您是从shared_ptrunique_ptrc_t*或任何其他类型的指针调用它。唯一可以做的区别是指向对象是否为const。因此,像void some_fn(std::shared_ptr<c_t> this)这样的构造一开始是毫无意义的。

(请注意,您可以通过检查程序的堆栈来确定您使用的指针类型,但我真的建议您不要采用这种方法,除非您正在处理非常具体的情况。)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71384296

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档