繁体   English   中英

函数样式模板语法

[英]Function-style template syntax

我正在尝试编写一个相当简单的类,该类带有一个函数,一些参数,并可以在以后的时间使用该参数执行该函数。

目前,这是我的代码:

template<typename R, typename... Args>
class Delayed
{
public:
    using FunctionT = std::function<R(Args...)>;

    Delayed(FunctionT func, Args... args) : func(func), args(std::forward<Args>(args)...)
    {

    }

private:
    FunctionT func;
    std::tuple<Args...> args;
};

int main()
{
    std::function<double(double)> doubleMe = [](double x) { return x * 2.0; };

    //Works
    Delayed<double, double> delayed1(doubleMe, 2.0);

    //Doesn't work
    Delayed<double(double)> delayed2(doubleMe, 2.0);
}

问题是,当我将double(double)作为参数传递时,而不是RdoubleArgsdouble ,它将double(double)传递给R而没有传递给Args

根据cppreferencestd::function的模板参数是template< class R, class... Args > 因此,如果我给它A(B,C) ,它将为变量R传递A B,C为可变参数Args传递B,C 但是,当我将其传递给我的班级时,它将传递R A(B,C) ,而不传递可变参数Args

应该如何使用此函数语法?为什么它对std::function但对我的类却不起作用?

因此,如果我给它A(B,C) ,它将为变量R传递A B,C为可变参数Args传递B,C

是的,但不是出于您的想法。 如果仔细观察,您会发现std::function部分专门用于任何函数类型:

template<typename R, typename... Args>
class function<R(Args...)>;
//            ^^^^^^^^^^^^

您可以将其想象为非常原始的模式匹配。 如果使用int(int, double)实例化function ,则可以认为Rint ,而Argsint, double 如果(部分)专业化比所有通用的通用主模板更匹配,那么就选择它,这就是这里发生的情况。

请记住: double(double)是一个类型,它是一个函数。 没有涉及它的任何特殊规则。 因此,在您的情况下,您可以这样做:

template<typename R, typename... Args>
class Delayed<R(Args...)> : public Delayed<R, Args...> {
  //         ^^^^^^^^^^^^
  //       partially specialize to decompose function types

  // We need to inherit constructors (only).
  using Delayed<R, Args...>::Delayed;
};

希望它能消除混乱。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM