Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;模板重载调用_C++_Function_Templates_Call_Overloading - Fatal编程技术网

C++ C++;模板重载调用

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

我正在尝试实现一个执行模式,它接受任何函数,并使用自己的条件/准备执行它。不管这是一件有用的事情,它就是不起作用。似乎我无法访问“Execute”函数(在“main”中调用)的模板重载

具体来说:为什么我不能调用Execute的重载模板函数

这是完整的程序:

#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);