c ++通过多个函数传递nullptr

时间:2014-12-10 12:38:07

标签: c++ nullptr

我遇到了一些代码问题,我需要通过多层函数传递指针。指针可以为null,因此对于nullptr的情况,我的最终函数的重载。概念我是这样的:

void test_ptr(std::nullptr_t)
{
  std::cout << "nullptr" << std::endl;
}
void test_ptr(double *d)
{
  std::cout << *d << std::endl;
}

void test(double *d)
{
  test_ptr(d);
}

int main()
{
  test(nullptr);
}

对我来说,理想的行为是test调用test_ptr的第一个版本,但事实并非如此。有没有机会操纵test以便它调用&#34;对&#34;版本

3 个答案:

答案 0 :(得分:5)

您需要一个功能模板:

void test_ptr(std::nullptr_t)
{
  std::cout << "nullptr" << std::endl;
}
void test_ptr(double *d)
{
  std::cout << *d << std::endl;
}

template<typename T>
void test(T d)
{
  test_ptr(d);
}

int main()
{
  test(nullptr);
}

在您的代码中,参数为double*,无论其转换的类型如何。 确保static_assert是指针类型的T也可以按顺序排列:

static_assert(std::is_pointer<T>{} || std::is_same<T, std::nullptr_t>{},
    "Not a pointer type!");

注意:C ++ 14还引入了std::is_null_pointer

答案 1 :(得分:1)

为什么不在nullptr函数的开头检查double*

在您的情况下,您不需要重载nullptr_t的函数。在这个问题中解释了std::nullptr_t的使用: What are the uses of the type `std::nullptr_t`?

所以这对你来说意味着:如果你有另一个test_ptr函数,它接受一个指针类型,那么你需要带有std::nullptr_t的重载函数。但只有一个test_ptr函数,没有必要。

答案 2 :(得分:1)

调用test(nullptr)后,您的double*恰好为null,但该值为运行时属性,其静态类型为double*所以test_ptr(d)始终会选择test_ptr(double*)。重载根据类型在编译时选择函数,而不是基于运行时值。