【发布时间】:2021-04-08 05:42:31
【问题描述】:
我有一个类,它的任务是在异步上下文中运行函数,因此可以将函数(或方法)作为输入。
现在我保留了两个具有不同名称的函数以将函数作为输入,因为我需要区分 void 返回类型和其他返回类型。将这两个函数命名为相同对我不起作用。我想要的是两者具有相同的名称,并且函数的调用者不需要考虑返回类型,如果他愿意并且可能的话,他可以得到它:
#include <functional>
template<typename Func, typename ...Args>
auto Foo(Func f, Args&&... args)
{
decltype(f(std::forward<Args>(args)...)) ret;
init();
ret = f(std::forward<Args>(args)...);
clean();
return ret;
}
template<typename Func, typename ...Args>
void FooVoid(Func f, Args&&... args)
{
init();
f(std::forward<Args>(args)...);
clean();
}
int Bar(){return 0;}
void Empty() {}
struct A
{
int Bar(){return 0;}
void Empty(){}
};
int main()
{
auto bar = Foo(Bar);
FooVoid(Empty);
A a;
bar = Foo(std::bind(&A::Bar, a));
FooVoid(std::bind(&A::Empty, a));
return 0;
}
我想要的是两个函数可以具有相同的名称而不会产生歧义。目前没有其他限制。我怎么能做到这一点?关于代码的任何其他建议也会有所帮助。我是这个话题的新手!
【问题讨论】:
标签: c++ templates variadic-templates