c++ - 允许各种函数类型的非类型模板参数?

标签 c++ function templates non-type

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

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

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

关于c++ - 允许各种函数类型的非类型模板参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50575289/

相关文章:

c - 使用在 main1() 中生成的值并在 main2() 中使用它们

c++ - 是否允许调用参数中的typename T?

c++ - 带有自定义分配器的 std::vector 子类与 std::vectors 之间的转换

Django 跨站反向 URL

c++ - 制作一个简单的 CLI C++ 程序所需的知识,该程序可以找到歌曲的歌词并将其显示给用户

c++ - 如何使用 Qt 打开网络摄像头并捕获图像并将其保存在系统上

c++ - 找到一组点的中心以顺时针排序?

c++ - 不同数据结构的速度/内存使用估计

function - DecimalToBinary 函数的输入是什么

delphi - 根据外部函数是否存在来声明它们