非类型模板参数允许各种函数类型?

Non-type template argument to allow various function types?

本文关键字:类型 许各种 函数 参数      更新时间:2023-10-16

下面是一些代码,其中函数模板将要调用的函数作为模板非类型参数:

template <class R, R func() >
auto Call() -> R
{
return func();
}
int f() { return 1; }
int main()
{
Call<int, f>();      // OK
Call<f>();           // Error
}

有没有办法使其可调用,而无需重复函数返回类型,如Call<f>()

它可以通过预处理器完成,#define CALL(f) Call<decltype(f()), f>,但我想知道是否可以在没有预处理器的情况下完成。

这就是auto模板参数旨在解决的问题(C++17 及更高版本(。

#include <cstdio>
#include <type_traits>
template <auto Fn>
auto Call() -> decltype(Fn()) {
return Fn();
}
int f() { return 1; }
int main() {
printf("%dn", Call<f>());
}

http://coliru.stacked-crooked.com/a/55808ba25f0a07cd