c++ - 将任何函数作为模板参数传递?

标签 c++ templates c++11 function-pointers variadic-templates

我正在寻找一种将通用(显然是 constexpr)函数传递给模板的方法。它必须能够接受任意数量的参数,而无需使用 lambda。这是我目前所拥有的:

template<typename T, T(*FUNC)()> struct CALL
{
    static inline constexpr decltype(FUNC()) EXEC()
    {
        return FUNC();
    }
};

然而,这仅在传递的函数不带参数时有效。有没有办法让模板接受任何 constexpr 函数?传递 std::function 似乎不起作用。 我想关键是可变模板参数,但我不知道如何在这种情况下利用它们。

最佳答案

如果我正确理解你想要实现的目标,你可以使用模板函数而不是带有静态函数的模板类:

#include <iostream>

template<typename T, typename... Ts>
constexpr auto CALL(T (*FUNC)(Ts...), Ts&&... args) -> decltype(FUNC(args...))
{
    return FUNC(std::forward<Ts>(args)...);
}

constexpr double sum(double x, double y)
{
    return (x + y);
}

int main()
{
    constexpr double result = CALL(sum, 3.0, 4.0);
    static_assert((result == 7.0), "Error!");
    return 0;
}

关于c++ - 将任何函数作为模板参数传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14297971/

相关文章:

c++ - 一个 Debug-Print 函数来控制它们

c++ - 当通过 const 引用传递的对象被添加到像 std::map 这样的容器时会发生什么?

c++ - 绘制从二值图像中检索到的轮廓

c++ - 类模板继承自不完整的类

c++ - C++模板-在类外部实现

c++ - 为什么下面的代码会导致模板实例化?

c++ - 虚函数和 "no legal conversion for this pointer"

c++ - 通过引用接收 lambda 作为参数的正确方法

同一 .NET 应用程序中的 C# 和 C++ 代码?

c++ - shark3.0 的 "BOOST_DIR NOT FOUND"在 win7 x64 操作系统下使用 boost1.54.0 和 cmake