[英]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)
作为参数传递时,而不是R
是double
和Args
是double
,它将double(double)
传递给R
而没有传递给Args
。
根据cppreference , std::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
,则可以认为R
为int
,而Args
为int, 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.