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

问题描述 投票:0回答:1

我有一个带有静态和重载成员函数的类。我想将其中一个用作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

c++ c++11 c++17 function-pointers member-function-pointers
1个回答
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的构造函数也是模板,这意味着编译器再次错过了有助于其与重载函数之一匹配的上下文。

© www.soinside.com 2019 - 2024. All rights reserved.