指向重载静态成员的函数指针 - 在 unique_ptr 中用作自定义删除器
Posted
技术标签:
【中文标题】指向重载静态成员的函数指针 - 在 unique_ptr 中用作自定义删除器【英文标题】:function pointer to overloaded static member - to use as custom deleter in unique_ptr 【发布时间】:2020-05-27 12:50:45 【问题描述】:我有一个具有静态和重载成员函数的类。
我想在unique_ptr
中使用它们作为自定义删除器
关于这个主题有很多问题,没有一个对我有用。
#include <iostream>
#include <memory>
#include <functional>
class A
public:
static void release()
std::cout << "void released\n";
static void release(int*i)
std::cout << *i << " released\n";
;
int main()
int i = 10;
std::unique_ptr<int, decltype(&A::release(int*))> ptr(&i, &A::release); // compiler error
std::unique_ptr<int, std::function<void(int*)>> ptr(&i, &A::release); // compiler error
return 0;
在这里试试:https://onlinegdb.com/H14txk3sL
【问题讨论】:
【参考方案1】:std::unique_ptr<int, void(*)(int*)> ptr(&i, &A::release);
// ~~~~~~~~~~~~^
这样,std::unique_ptr
的构造函数将期望一个特定类型的指针,这将有助于编译器解决歧义。
这个:
decltype(&A::release(int*))
不是有效的语法。为了让你使用decltype(e)
,你必须写decltype(&A::release)
,但这又会引发歧义错误,所以它必须变成:
decltype(static_cast<void(*)(int*)>(&A::release))
但这是一种冗长的说法 void(*)(int*)
。
这个:
std::function<void(int*)>
无助于解决歧义,因为std::functions
的构造函数也是模板,这意味着编译器再次错过了有助于选择重载函数之一的上下文。
【讨论】:
以上是关于指向重载静态成员的函数指针 - 在 unique_ptr 中用作自定义删除器的主要内容,如果未能解决你的问题,请参考以下文章