推断指针非类型模板参数的类型

Deducing the type of a pointer non-type template parameter

本文关键字:类型 参数 指针      更新时间:2023-10-16

我有一个函数,它接受指向任意对象(带链接(的指针作为非类型模板参数O,如下所示:

Foo foo;
...
template <typename T, T* O>
ftype* make_function() {
// do something with O
}

要将指针传递给类型为Foofoo对象,我需要像这样调用它:

make_function<Foo, &foo>()

但是,我想简单地将其称为make_function<&foo>(),即推导出指针的类型Foo,因为它可能具有类似的模式(例如,如果我将foo作为参数传递(。

这里有一个关于Godbolt的更充实的例子。

C++17 允许

template <auto* O>
ftype* make_function() {
// do something with O
}

在此之前,您确实需要

template <typename T, T* p>

宏可以帮助减少使用时的冗长程度:

#define AUTO(p) decltype(p), p
// ...
make_function<AUTO(&foo)>();