如何将 NULL 或 nullptr 传递给接收 unique_ptr 参数的函数?
How to pass NULL or nullptr to a function that receives a unique_ptr argument?
template<typename T>
void foo(T&& p1)
{
p1.get();
}
int main(int argc, char *argv[])
{
auto a = std::unique_ptr<int>();
a = NULL;
// this works because a is a unique ptr and it has a get method
foo(a);
// this does not work because NULL does not has this method. But can it work tho like how we use the raw pointer?
foo(NULL);
return 0;
}
所以基本上我想完成一些可以接收 nullptr 文字和 unique_ptr 作为函数参数的 function/API。我该怎么做?
您可以为 std::nullptr_t
编写重载:
void foo(std::nullptr_t) {}
而 SFINAE 是第一个将其丢弃为错误类型的形式,如 int
(NULL
的可能类型):
template<typename T>
auto foo(T&& p1) -> decltype(p1.get(), void())
{
p1.get();
}
但使用 nullptr
而不是 NULL
如果foo
具体接受unique_ptr
,你可以这样写:
template<typename ...T>
void foo(std::unique_ptr<T...>& p1)
{
p1.get();
}
关于使用 NULL
参数,我建议不要那样做。它是一个可以计算为 int
文字 0
或 std::nullptr_t
类型的纯右值的宏,并且不再是向未指向有效内存的指针发出信号的首选方式。
您应该改用 nullptr
,然后您可以编写一个重载来匹配它:
void foo(std::nullptr_t) {}
如果您仍然想使用 NULL
或以其他方式匹配任何不是 unique_ptr
特化的参数,您可以添加一个匹配其他所有内容的重载:
void foo(...) {}
这是一个demo。
template<typename T>
void foo(T&& p1)
{
p1.get();
}
int main(int argc, char *argv[])
{
auto a = std::unique_ptr<int>();
a = NULL;
// this works because a is a unique ptr and it has a get method
foo(a);
// this does not work because NULL does not has this method. But can it work tho like how we use the raw pointer?
foo(NULL);
return 0;
}
所以基本上我想完成一些可以接收 nullptr 文字和 unique_ptr 作为函数参数的 function/API。我该怎么做?
您可以为 std::nullptr_t
编写重载:
void foo(std::nullptr_t) {}
而 SFINAE 是第一个将其丢弃为错误类型的形式,如 int
(NULL
的可能类型):
template<typename T>
auto foo(T&& p1) -> decltype(p1.get(), void())
{
p1.get();
}
但使用 nullptr
而不是 NULL
如果foo
具体接受unique_ptr
,你可以这样写:
template<typename ...T>
void foo(std::unique_ptr<T...>& p1)
{
p1.get();
}
关于使用 NULL
参数,我建议不要那样做。它是一个可以计算为 int
文字 0
或 std::nullptr_t
类型的纯右值的宏,并且不再是向未指向有效内存的指针发出信号的首选方式。
您应该改用 nullptr
,然后您可以编写一个重载来匹配它:
void foo(std::nullptr_t) {}
如果您仍然想使用 NULL
或以其他方式匹配任何不是 unique_ptr
特化的参数,您可以添加一个匹配其他所有内容的重载:
void foo(...) {}
这是一个demo。