“std::nullptr_t”模板参数的正确用例是什么? 今天我知道C++允许非类型模板参数类型 STD::NulpPrtRt: template<std::nullptr_t N> struct A { }; template<std::nullptr_t N> void f() { } 模板结构A{}; 模板void f(){}

“std::nullptr_t”模板参数的正确用例是什么? 今天我知道C++允许非类型模板参数类型 STD::NulpPrtRt: template<std::nullptr_t N> struct A { }; template<std::nullptr_t N> void f() { } 模板结构A{}; 模板void f(){},c++,templates,C++,Templates,就我个人而言,我无法为这些提出任何合理的用例。任何人都能提出这样的理由吗?我想在这样的环境下,这是最有用的: template <typename T, T Value> struct Foo; Foo<int, 10> x; Foo<std::nullptr_t, nullptr> y; template <typename T, T Ptr> struct pointer_object { static T get_pointer(

就我个人而言,我无法为这些提出任何合理的用例。任何人都能提出这样的理由吗?

我想在这样的环境下,这是最有用的:

template <typename T, T Value> struct Foo;

Foo<int, 10> x;
Foo<std::nullptr_t, nullptr> y;
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;
模板结构Foo;
富x;
福伊;
这没什么坏处


(可能
std::integral_constant
就是一个例子。)

这似乎可以避免使用指针类型和
std::nullptr_t
的值创建特殊情况模板的需要。也就是说,用例看起来像这样:

template <typename T, T Value> struct Foo;

Foo<int, 10> x;
Foo<std::nullptr_t, nullptr> y;
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;
模板
结构指针对象{
静态T get_指针(){return Ptr;}
};
int_ptr(0);
typedef pointer_object int_ptrt;
typedef指针\u对象空\u ptr\t;

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

我认为没有使用案例,但允许它发生并没有足够的危害,不值得费心阻止它发生。如果你真的停止了它,你要么决定nullptr_t根本不是一个类型,要么你必须创建一个特例来说明它不是一个允许作为模板参数的类型(并且在编译器中也这样做以停止它的使用)。@JerryCoffin有一个允许作为模板参数的类型的显式列表。因此,目前有一种特殊情况,即允许将其作为模板参数。这并不是说我个人不喜欢这个问题,而是FAQ确实说“你应该根据你面临的实际问题提出实际的、可回答的问题。”。。。那么这个应该关闭吗?@Mehrdad:不,这是一个关于堆栈溢出的好问题。好奇心是一个完全正确的“实际问题”;无论我们的老板是否要求我们,我们都在这一领域进一步了解自己。被解雇是一个替代的问题不是一个先决条件-事实上,通常这些问题吮吸可怕。FWIW,我是一个C++程序员,知道为什么某些构造是C++的一部分增加我的可能性,以保持主管比不知道。对我来说,这听起来像是一个现实生活中的实际问题。@Öö,正确的用例是很好的理论依据。但是我不太明白这有什么用:)为什么
fooy也允许?@johanneschaub-litb:
void
是一个不完整的类型,永远无法完成。@johanneschaub-litb:但非类型模板参数必须有值,而不仅仅是表达式,非<代码>(void())
没有值。。。这正是我的直觉。@LightnessRacesinOrbit:你能把你的猜测留给自己吗?我当然没有否决这个答案,实际上我已经否决了约翰尼斯的问题。@Mehrdad:我是在开玩笑。我们在这里都是朋友