gpt4 book ai didi

c++ - 如何在 C++11 中返回包含自定义删除器的 std::unique_ptr?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:26:15 26 4
gpt4 key购买 nike

我的应用程序编译器最多只能支持 c++11

下面是我的项目和函数 get_conn() 的片段代码返回 std::unique_ptr 和自定义删除器(删除器需要两个参数)。我正在使用 auto 关键字作为返回类型,但它给出了一个错误,就像 if is compiled with c++11 (compiles fine with c++14)

error: ‘get_conn’ function uses ‘auto’ type specifier without trailing return type

演示示例代码:

#include <iostream>
#include <functional>
#include <memory>
using namespace std;


// Dummy definition of API calls
int* open_conn (int handle)
{
return new int;
}
void close_conn (int handle, int *conn)
{}

auto get_conn (int handle)
{
// API call
int* conn = open_conn (handle);
auto delete_conn = [](int *conn, int handle) {
// API call
close_conn (handle, conn);
delete conn;
};
auto delete_binded = std::bind (delete_conn, std::placeholders::_1, handle);
return std::unique_ptr<int, decltype(delete_binded)> (conn, delete_binded);
}

int main()
{
int handle = 2; // suppose
auto c = get_conn (handle);
if (!c)
cout << "Unable to open connection\n";

return 0;
};

如何将 auto 关键字替换为 std::unique_ptr 的实际返回类型,以与 c++11 兼容代码?

我尝试使用以下返回类型但失败了

std::unique_ptr<int, void(*)(int *,int)> get_conn(int handle)
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
{
// ...
}

最佳答案

回到仿函数!

函数的auto 返回类型是特征。为了提供实际的返回类型,您可以提供如下仿函数(如评论中提到的@IgorTandetnik)。优点是,您不再需要 std::bind

( See online )

struct DeleteConn  // functor which subsituts the lambda and `std::bind`
{
int _handle;
explicit DeleteConn(int handle): _handle{ handle } {}
void operator()(int* conn) const
{
// API call
close_conn(_handle, conn);
delete conn;
}
};

std::unique_ptr<int, DeleteConn> get_conn(int handle)
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ---> now you can provide the actual type.
{
// API call
int* conn = open_conn(handle);
DeleteConn delete_conn{ handle };
return std::unique_ptr<int, DeleteConn>(conn, delete_conn);
}

或者,您可以将 lambda 函数 delete_connget_conn 函数中移出并使用 trailing return type 这是一个 特点。

( See Online )

namespace inter {
auto delete_conn = [](int* conn, int handle)
{
// API call
close_conn(handle, conn);
delete conn;
};
}

auto get_conn(int handle)
->std::unique_ptr<int, decltype(std::bind(inter::delete_conn, std::placeholders::_1, handle))>
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ --->Trailing return type
{
// API call
int* conn = open_conn(handle);
auto delete_binded = std::bind(inter::delete_conn, std::placeholders::_1, handle);
return std::unique_ptr<int, decltype(delete_binded)>(conn, delete_binded);
}

关于c++ - 如何在 C++11 中返回包含自定义删除器的 std::unique_ptr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57335434/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com