指向重载静态成员的函数指针 - 在 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(&amp;A::release),但这又会引发歧义错误,所以它必须变成:

decltype(static_cast<void(*)(int*)>(&A::release))

但这是一种冗长的说法 void(*)(int*)


这个:

std::function<void(int*)>

无助于解决歧义,因为std::functions 的构造函数也是模板,这意味着编译器再次错过了有助于选择重载函数之一的上下文。

【讨论】:

以上是关于指向重载静态成员的函数指针 - 在 unique_ptr 中用作自定义删除器的主要内容,如果未能解决你的问题,请参考以下文章

如何从静态成员函数调用指向成员函数的指针?

成员函数指针和指向静态成员函数的指针

指向任何类类型的非静态成员函数的 C++ 函数指针

关于纯抽象类中的静态成员函数 - 设计模式?

C ++创建指向标头内所有公共静态成员函数的指针数组,然后使用它

C++:如何返回指向非静态成员函数的指针?