Каков правильный пример использования параметров шаблона std:: nullptr_t`?

Сегодня я узнал, что С++ разрешает параметры шаблона типа std::nullptr_t непигового типа:

template<std::nullptr_t N> struct A { };

template<std::nullptr_t N> void f() { } 

В моей жизни я не могу придумать какой-либо разумный случай использования. Может ли кто-нибудь придумать для этого обоснование?

Ответ 1

Кажется, это позволяет избежать необходимости использования специального шаблона case с использованием типа указателя и значения для std::nullptr_t. В этом случае пример использования выглядел бы примерно так:

template <typename T, T Ptr>
struct pointer_object {
    static T get_pointer() { return Ptr; }
};

int int_ptr(0);

typedef pointer_object<int*, &int_ptr> int_ptr_t;
typedef pointer_object<std::nullptr_t, nullptr> null_ptr_t;

То есть значения указателя могут быть аргументами шаблона, и поэтому nullptr тоже должен быть.

Ответ 2

Я думаю, что это наиболее полезно в настройках, подобных этому:

template <typename T, T Value> struct Foo;

Foo<int, 10> x;
Foo<std::nullptr_t, nullptr> y;

В этом нет вреда.

(Может быть, std::integral_constant является примером этого.)