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的方法重载绑定到任意整数
预先感谢
答案 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_t
,0
,0UL
的定义,当然还有NULL
本身。
如果您只想消除nullptr
与int*
的歧义,那么我们可以修改过载解决规则。例如,将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不是特定类型,您不能使用类型检测方法来选择正确的重载。