c++ - 如何在模板参数中分离函数类型返回类型和参数

标签 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 .

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

我怎样才能做到这一点?我的解决方案最多可以使用 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};
    }
};

关于c++ - 如何在模板参数中分离函数类型返回类型和参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58458812/

相关文章:

c++ - 第一个参数设置为第二个参数的模板化 C++ 函数作为默认参数

c++ - LEX:段错误:11

c++ - decltype( (A{}.int_member) ) 的正确结果是什么?

c++ - 派生类中的成员字段别名(无访问函数)

c++ - 在堆中创建和使用数组

c++ - 为什么 C++ 不让基类实现派生类的继承接口(interface)?

c++ - 为什么我会收到运行时检查失败 #2 - 变量 'x' 周围的堆栈已损坏?

c++ - 在内联匿名命名空间中声明的全局命名空间中定义模板函数时 undefined reference

c++ - 内仿函数概念或接口(interface)

c++ - 包装一个可能返回 void 的可调用对象