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

Posted

技术标签:

【中文标题】推断指针非类型模板参数的类型【英文标题】:Deducing the type of a pointer non-type template parameter 【发布时间】:2020-06-21 21:32:13 【问题描述】:

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

Foo foo;

...

template <typename T, T* O>
ftype* make_function() 
    // do something with O

要将指针传递给Foo 类型的foo 对象,我需要这样调用它:

make_function<Foo, &foo>()

但是,我想简单地将其称为 make_function&lt;&amp;foo&gt;(),即推断出指针的类型 Foo,因为它可能具有相似的模式(例如,如果我将 foo 作为论据)。

这是关于 Godbolt 的更多 fleshed out example。

【问题讨论】:

【参考方案1】:

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)>();

【讨论】:

是的,我目前正在使用与宏解决方案类似的东西,我应该说“非宏”。不幸的是,我的目标是 c++14。 @BeeOnRope:您需要您无权访问的版本的功能。因此,您受限于旧语法或可用的解决方法(例如 MACRO)。 好的,谢谢。如果其他人有聪明的解决方案,我会暂时打开它。

以上是关于推断指针非类型模板参数的类型的主要内容,如果未能解决你的问题,请参考以下文章

是否可以将指针视为非类型模板参数中的整数类型?

非类型模板参数

模板与泛型编程——模板实参推断

指向任意类方法的模板非类型指针

我可以将 C++17 无捕获 lambda constexpr 转换运算符的结果用作函数指针模板非类型参数吗?

现代C++之理解auto类型推断