【发布时间】:2018-09-08 02:02:47
【问题描述】:
我正在尝试编写一个相当简单的类,它接受一个函数和一些参数,并且可以在以后执行带有参数的函数。
目前,这是我的代码:
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。但是,当我将它传递给我的班级时,它会将A(B,C) 传递给R,而没有传递任何可变参数Args。
这个函数语法应该如何使用,为什么它适用于std::function 而不是我的班级?
【问题讨论】:
-
因为它们的写法不同。对函数类型使用偏特化
-
auto delayed = std::bind(doubleMe, 2.);后跟delayed()? -
@Jarod42 我考虑过这一点,虽然它会起作用,但拥有一个类似的类对我来说更方便。
标签: c++ templates c++14 variadic