指向重载静态成员的函数指针 - 在 unique_ptr 中用作自定义删除器

function pointer to overloaded static member - to use as custom deleter in unique_ptr

我有一个 class 带有静态和重载的成员函数。 我想将其中一个用作 unique_ptr 中的自定义删除器 关于这个主题有很多问题,none 其中对我有用。

#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

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 的构造函数也是一个模板,这意味着编译器再次错过了有助于它选择重载函数之一的上下文。