下面是一些代码,其中函数模板将函数作为模板非类型参数调用:
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("%d\n", Call<f>());
}
关于c++ - 允许各种函数类型的非类型模板参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50575289/