什么是`std :: nullptr_t`模板参数的正确用例?

Joh*_*itb 26 c++ templates

今天我开始知道C++允许类型的非类型模板参数std::nullptr_t:

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

template<std::nullptr_t N> void f() { } 
Run Code Online (Sandbox Code Playgroud)

对于我的生活,我无法想出任何明智的用例.任何人都可以为此提出理由吗?

Die*_*ühl 21

似乎允许使用指针类型和值来避免使用特殊案例模板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;
Run Code Online (Sandbox Code Playgroud)

也就是说,指针值可以是模板参数,因此也nullptr应该是.


Ker*_* SB 8

我想这在这样的设置中最有用:

template <typename T, T Value> struct Foo;

Foo<int, 10> x;
Foo<std::nullptr_t, nullptr> y;
Run Code Online (Sandbox Code Playgroud)

没有坏处.

(也许std::integral_constant就是一个例子.)

  • @ JohannesSchaub-litb:但是非类型模板参数必须有*值*,而不仅仅是表达式,非?`(void())`没有价值......这只是我的直觉. (3认同)
  • @Mehrdad:我在开玩笑.我们都是这里的朋友 (3认同)
  • @öö,正确的用例是很好的理由恕我直言.但是我没有看到使用这个:)为什么不是`Foo <void,(void())> y;`允许以及? (2认同)
  • @ JohannesSchaub-litb:`void`是一个永远无法完成的不完整类型. (2认同)
  • Downvoter,小心解释你的反对意见? (2认同)
  • @LightnessRacesinOrbit:你能不能对自己保持猜测?我当然没有低估这个答案,我实际上*赞成了约翰内斯的问题. (2认同)