我有一个带有静态和重载成员函数的类。我想将其中一个用作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;
}
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
的构造函数也是模板,这意味着编译器再次错过了有助于其与重载函数之一匹配的上下文。