【问题标题】:What is a proper use-case of `std::nullptr_t` template parameters?`std::nullptr_t` 模板参数的正确用例是什么?
【发布时间】:2012-12-02 00:46:58
【问题描述】:

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

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

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

在我的一生中,我无法为这些提出任何明智的用例。任何人都可以为此提出理由吗?

【问题讨论】:

  • 我不认为有一个用例,但是没有足够的伤害让它值得阻止它发生的麻烦。如果您确实停止了它,则必须确定 nullptr_t 根本不是类型,您必须创建一个特殊情况来说明它不是允许作为模板的类型参数(并在编译器中执行相同操作以停止使用)。
  • @JerryCoffin 有一个明确的类型列表允许作为模板参数。所以目前有一种特殊情况说是允许作为模板参数的。
  • 并不是我个人不喜欢这个问题,而是常见问题解答确实“你应该只根据你所面临的实际问题提出实用的、可回答的问题。”...所以应该关闭它吗?
  • @Mehrdad:不,这对 Stack Overflow 来说是个好问题。好奇心是一个完全有效的“实际问题”;无论我们的老板是否要求我们这样做,我们都在这个领域进一步加深我们的知识。作为替代方案被解雇并不是提出问题的先决条件 - 事实上,通常那些问题非常糟糕。
  • FWIW,我是一名 C++ 程序员,知道为什么某些结构是 C++ 的一部分会增加我保持负责的可能性,而不是不知道。对我来说,这听起来像是一个现实生活中的实际问题

标签: c++ templates


【解决方案1】:

似乎允许使用指针类型和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 就是一个例子。)

    【讨论】:

    • @Öö,正确的用例是恕我直言的好理由。但我不太明白这个的用途:) 为什么Foo&lt;void, (void())&gt; y; 也不允许?
    • @JohannesSchaub-litb: void 是一个永远无法完成的不完整类型。
    • @JohannesSchaub-litb:但非类型模板参数必须有,而不仅仅是表达式,不是吗? (void()) 没有价值……这只是我的直觉。
    • @LightnessRacesinOrbit:请您保留您的猜测吗?我当然没有否决这个答案,实际上我赞成 Johannes 的问题。
    • @Mehrdad:我在开玩笑。我们在这里都是朋友
    猜你喜欢
    • 2014-08-26
    • 2012-08-17
    • 2020-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多