C++ C++;模板重载调用
我正在尝试实现一个执行模式,它接受任何函数,并使用自己的条件/准备执行它。不管这是一件有用的事情,它就是不起作用。似乎我无法访问“Execute”函数(在“main”中调用)的模板重载 具体来说:为什么我不能调用Execute的重载模板函数 这是完整的程序:C++ C++;模板重载调用,c++,function,templates,call,overloading,C++,Function,Templates,Call,Overloading,我正在尝试实现一个执行模式,它接受任何函数,并使用自己的条件/准备执行它。不管这是一件有用的事情,它就是不起作用。似乎我无法访问“Execute”函数(在“main”中调用)的模板重载 具体来说:为什么我不能调用Execute的重载模板函数 这是完整的程序: #include "stdafx.h" #include <functional> class TransparentFunctionWrapper { public: virtual void Execute(std
#include "stdafx.h"
#include <functional>
class TransparentFunctionWrapper
{
public:
virtual void Execute(std::function<void()> executeFunction) = 0;
template<class C>
C Execute(std::function<C(void)> executeFunction) // template-overload of the abstract function which will implicitly call it
{
C ret;
Execute( // calls the abstract function with a lambda function as parameter
[ret, executeFunction](void) -> C // lambda declaraction
{ //
ret = executeFunction; // lambda body
}); //
return ret;
}
};
class ExampleExecutor : public TransparentFunctionWrapper
{
public:
virtual void Execute(std::function<void()> executeFunction)
{
printf("executed before.");
executeFunction();
printf("executed after.");
}
};
void DoStuff() {}
int ReturnStuff() { return -5; }
int main()
{
ExampleExecutor executor;
executor.Execute(DoStuff);
int i = executor.Execute<int>(ReturnStuff); // Why does this not work? ERROR: "type name is not allowed"
getchar();
return 0;
}
感谢所有愿意帮忙的人
示例executor::Execute
没有覆盖透明函数包装器::Execute
,而是将其隐藏在executor.Execute
调用中
您必须显式调用TransparentFunctionWrapper::Execute
,因为它被ExampleExecutor::Execute
隐藏。以下是一种可能的方法:
int i = executor.TransparentFunctionWrapper::Execute<int>(ReturnStuff);
int i=executor.TransparentFunctionWrapper::Execute(ReturnStuff);
注意:
ret
由值捕获到lambda中。这将无法编译,因为您试图在lambda不可变的情况下在主体中分配它,并且无论如何也不会执行您想要的操作。使用[&]
通过引用捕获。感谢您指出这一点,我实际上是在这个时候调试的非常感谢你!您知道通过“ExampleExecutor”类公开“Execute”的方法吗?用“executor.TransparentFunctionWrapper::Execute”调用它相当不方便:P@Oachkatzl:您可以在ExampleExecutor
中提供一个不同名称的包装器(例如ExecuteBase
),该包装器调用TransparentFunctionWrapper::Execute
。感谢您的回答!奇怪的是,如果我将“Execute(function)”重命名为“ExecuteWithReturn”,那么“ExampleExecutor”并没有隐藏它。这并不能真正让我满意,因为我想让它过载,以明确他们基本上在做同样的事情,但我想这是最好的。
"type 'int' unexpected"
int i = executor.TransparentFunctionWrapper::Execute<int>(ReturnStuff);