特定于NULL的参数解析

时间:2018-10-31 15:19:28

标签: c++

C ++ 11引入了std::nullptr_t,以允许显式重载传递nullptr常量的方法。我想要的是相同的东西,但带有旧的NULL(又名0)。 我觉得应该有一种利用SFINAE的解决方案,但对于我的一生,我想不出一个。

更清楚地说,我想使用3种方法:

Foo(int*); //binds to an int pointer
Foo(std::nullptr_t); //binds to a nullptr constant
Foo(something); //should bind to NULL

something应该是什么,这样对Foo(NULL)的调用才不会模棱两可?

我不希望NULL的方法重载绑定到任意整数

预先感谢

2 个答案:

答案 0 :(得分:1)

相同的<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto"> <Button android:id="@+id/button" android:layout_width="157dp" android:layout_height="140dp" android:text="Button" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent"/> <TextView android:id="@+id/textview" android:layout_width="150dp" android:layout_height="50dp" android:text = "Some text" android:gravity="center" android:textSize="15sp" android:textColor="#05afaf" app:layout_constraintBottom_toBottomOf="@id/button" app:layout_constraintStart_toStartOf="@id/button" app:layout_constraintEnd_toEndOf="@id/button" android:layout_marginBottom="20dp" /> </android.support.constraint.ConstraintLayout> 重载也可以与Foo(std::nullptr_t)一起使用。从 any 空指针常量到NULL的隐式转换。其中包括std::nullptr_t00UL的定义,当然还有NULL本身。

如果您只想消除nullptrint*的歧义,那么我们可以修改过载解决规则。例如,将nullptr_t用作模板:

Foo(int*)

在重载时,非模板始终是与模板的更好匹配。

答案 1 :(得分:0)

  

C ++ 11引入了std :: nullptr_t,以允许显式重载传递nullptr常量的方法。

不完全是。它的引入是为了使您可以拥有类型安全的 null 。这不符合您的期望:

foo (int a);
foo (int *a);
...
foo (NULL); // Calls the overload with `int` not `int*`!

此功能的目的是什么

Foo(std::nullptr_t a);

它不可能做Foo()做不到的任何有用的事情。在您的示例中,不必担心传递NULL。您应该考虑为什么不使用#define NULL nullptr。或者直接使用nullptr

要回答总体问题:特定于NULL的参数解析

我认为这不可能。 NULL不是特定类型,您不能使用类型检测方法来选择正确的重载。