如何在模板参数中分隔函数类型的返回类型和参数

时间:2019-10-18 22:16:58

标签: c++ c++17

我想将函数类型(例如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。这是live sample

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

我该如何完成?我的解决方案最多可以使用C ++ 17。

1 个答案:

答案 0 :(得分:4)

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