首页 > 解决方案 > 如何在具有引用&的方法上返回 shared_ptr nullptr?

问题描述

我的代码是:

template<class T>
static shared_ptr<T>& getSharedPtr(lua_State* L, int32_t arg)
{
    return *static_cast<shared_ptr<T>*>(lua_touserdata(L, arg));
}

此方法返回对 shared_ptr 的引用,因此当以下函数超出范围时,实际引用计数器会减少:

int32_t luaADelete(lua_State* L) {
    auto& a = getSharedPtr<A>(L, 1); // No increase ref count
    if (a) {
        a.reset(); // Real shared_ptr decrease ref count
    }

    return 0;
}

一切都很好,但是如果堆栈上的对象不是有效的用户数据,我希望能够返回 nullptr,那么困境是在这种情况下我不能为特定方法返回 nullptr,因为它总是想返回一个引用。 static shared_ptr<T>& getSharedPtr(lua_State* L, int32_t arg)

下面的方法有效,但是看起来很丑,不知道是不是正确的做法:

template<class T>
static shared_ptr<T>& getSharedPtr(lua_State* L, int32_t arg)
{
    if (!is<T>(L, arg)) {
        static shared_ptr<T> shared_empty;
        return shared_empty;
    }

    return *static_cast<shared_ptr<T>*>(lua_touserdata(L, arg));
}

我知道这种情况可以通过直接返回真实指针来处理,但我不希望它那样工作,因为它在编写时更麻烦:

// shared_ptr->get()->method(...); BAD!

// shared_ptr.get(); OK!
// shared_ptr->method(...); OK!

如果有人可以帮助我,我将不胜感激,我一直在互联网上搜索,我找不到类似的东西,所以我决定在这里写这个问题,非常感谢你,祝你有个美好的一天!

以下是您可以在线编译和测试的示例代码,以便您更轻松地帮助我:https ://godbolt.org/z/of4cTMG5e

标签: c++shared-ptrlua-api

解决方案


推荐阅读