我试图找到一种方法来调用许多类成员函数,每个类成员函数都有不同的参数,并且在调用之前和之后发生某些已知的功能。
这个包装函数是我尝试过的,但是例如对它的最终调用不会编译错误:
'bool Wrapper(Work * ,std::function,Args &&...)' :可以
不推断模板参数
'std::function' 来自
'std::_Bind,Work *const >'
class Work
{
public:
void DoWork(int a, double b, string c);
private:
void Pre() {};
void Post() {};
bool Step1() { return true; }
bool Step2(int) { return true; }
bool Step3(double, string) { return true; }
};
template<typename... Args>
bool Wrapper(Work *work, std::function<bool(Args...)> func, Args&&... args)
{
work->Pre();
bool ret = func(std::forward<Args>(args)...);
work->Post();
return ret;
}
void Work::DoWork(int a, double b, string c)
{
if (!Wrapper<>(this, std::bind(&Work::Step1, this))) // error
return;
if (!Wrapper<int>(this, std::bind(&Work::Step2, this), a)) // error
return;
if (!Wrapper<double, string>(this, std::bind(&Work::Step3, this), b, c)) // error
return;
}
int main()
{
Work work;
work.DoWork(1, 2.0, "three");
return 0;
}
(将前置和后置功能放在步骤中乍一看似乎更可取,但这是不可取的,因为上面是实际代码的一个非常简化的示例,并且步骤有多个返回位置,并且没有测试。)
我认为显式模板参数将使模板解析成为可能。我究竟做错了什么?