什么是“std::nullptr_t”模板参数的正确用例
What is a proper use-case of `std::nullptr_t` template parameters?
今天我开始知道C++允许类型std::nullptr_t
的非类型模板参数:
template<std::nullptr_t N> struct A { };
template<std::nullptr_t N> void f() { }
对于我的一生,我无法为这些想出任何明智的用例。任何人都可以为此提出一个理由吗?
似乎允许这样做以避免需要使用指针类型和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
也应该是模板参数。
我想它在这样的设置中最有用:
template <typename T, T Value> struct Foo;
Foo<int, 10> x;
Foo<std::nullptr_t, nullptr> y;
这无妨。
(也许std::integral_constant
就是一个例子。
相关文章:
- 带有指定长度字符* 参数的 std::regex_search 在 VS2017 中不起作用?
- 为什么 std::function 可以作为 std::not2 的参数?
- 传递给std::function template的template参数究竟代表什么
- 转换函数,将 std::数组的双精度作为参数或双精度作为参数单独转换
- 在C++中,使用带有 std::optional 参数的函数<T>来表示可选参数是否有意义?
- 将函数参数"const char*"转换为"std::string_view"是
- 当指向对象的指针作为参数传递给 std::thread 时,内存可见性
- 为什么 std::绑定错误参数可以成功?
- 使用模板化的键类型定义 std::map,该键类型基于作为参数接收的函数
- std::vector 没有重载函数的实例与参数列表匹配
- std::span<const T> 作为函数模板中的参数
- SegFault 同时使用 std::string::operator+= 和函数作为参数
- 如果模板没有可变参数,则 Lambda 被推导出为 std::function
- 将参数打包的参数传递到 std::queue 中,以便稍后使用不同的函数调用
- 在构造函数中使用可变参数初始化 std::tuple
- 函数对象无法识别它获得的参数(std::set<int>)
- C 11构造函数参数:std ::移动和值或std :: forward and rvalue参考
- std::move 或 std::forward 参数 std::unique_ptr&<T>&
- 错误:不允许使用"C++/ObjC++"使用无效参数"-std=gnu99"
- **编译器错误** - getline() 函数不接受第一个参数"std:ifstream"是什么我的问题?