我正在尝试编写一个相当简单的类,它接受一个函数和一些参数,并且可以稍后使用参数执行该函数。
目前,这是我的代码:
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
.
According to cppreference , std::function
的模板参数是 template< class R, class... Args >
。所以如果我给它A(B,C)
,它将通过A
对于参数 R
和B,C
对于可变参数 Args
。但是当我将其传递给我的类(class)时,它会传递 A(B,C)
对于 R
并且不为可变参数 Args
传递任何内容.
这个函数语法应该如何使用以及为什么它适用于 std::function
但不是我的类(class)?
最佳答案
So if I give it
A(B,C)
, it will passA
for the argumentR
andB,C
for the variadic argumentArgs
.
是的,但原因不是你想象的那样。如果仔细观察,您会发现 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;
};
希望它能消除困惑。
关于c++ - 函数式模板语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49550541/