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