代码之家  ›  专栏  ›  技术社区  ›  void.pointer

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

  •  0
  • void.pointer  · 技术社区  · 5 年前

    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 正如我所料。这是 live sample

    decltype 这里的解决方案似乎不适用。

    我怎样才能做到这一点?我可以用C++ 17来解决我的问题。

    1 回复  |  直到 5 年前
        1
  •  4
  •   aschepler    5 年前

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