首页 > 解决方案 > 如何在模板参数中分离函数类型返回类型和参数

问题描述

我想将函数类型(例如int(float))传递给将返回类型与变量参数列表分开的类模板:

template<typename R, typename... Args>
class CallFunction
{
public:
    R operator()(Args&&... args)
    {
        std::cout << ("" << ... << (args << "\n"));
        return R{100};
    }
};

int main()
{
    CallFunction<int(float)> cf;
    std::cout << "return value: " << cf(200.f) << "\n";
}

我意识到上面的代码不起作用。在这种情况下,R等于int(float)而不是int像我期望的那样。这是现场样品

我以前见过这样的模板诡计,它实际上以某种方式起作用。我已经在 SO 上看到了很多关于如何执行此操作的答案,但它需要一个有效的函数指针。在这里,我直接指定函数类型,所以decltype解决方案似乎不适用于这里。

我怎样才能做到这一点?我的解决方案最多可以使用 C++17。

标签: c++c++17

解决方案


int(float)是单一类型(特别是函数类型),因此您的模板只需要采用一种类型。但是您可以使用部分特化来推导返回类型和参数类型。

template <typename>
class CallFunction; // This primary template is not defined.

template <typename R, typename... Args>
class CallFunction<R(Args...)>
{
public:
    R operator()(Args&&... args)
    {
        std::cout << ("" << ... << (args << "\n"));
        return R{100};
    }
};

推荐阅读