首页 \ 问答 \ 带有附加arg的C ++模板问题(C++ Template issue with additional arg)

带有附加arg的C ++模板问题(C++ Template issue with additional arg)

我有一种情况(在嵌入式系统上),我想从另一个任务调用函数。 我发现这种方法可以这样做http://www.drdobbs.com/elegant-function-call-wrappers/184401385 。 但是我有更多的论据要做什么。 最好的情况我有一个解决方案,这是在模板中,但我不知道如何实现这一点。 无论如何,也可以创建两个镜像,如下所示(在一个小型的Visual Studio C ++测试中)。 除了给出编译时错误的DeferCall2调用外,一切都运行正常。 我在这里搞错了什么?

#include "stdafx.h"
#include "stdlib.h"
#include "stdio.h"



class Functor
{
public:
    virtual ~Functor() {}
    virtual void operator()() = 0;
};
template< class CalleePtr, class MemFunPtr, class Parm1 >
class MemberFunctor1 : public Functor
{
public:
    MemberFunctor1
        (
        const CalleePtr & pCallee,
        const MemFunPtr & pFunction,
        Parm1 aParm1
        ) :
        pCallee(pCallee),
        pFunction(pFunction),
        aParm1(aParm1)
    {
    }

    virtual void operator()()
    {
        if ((pCallee != NULL) &&
            (pFunction != NULL))
        {
            ((*pCallee).*pFunction)(aParm1);
        }
    }

private:
    CalleePtr pCallee;
    MemFunPtr pFunction;
    Parm1 aParm1;
};

template< class CalleePtr, class MemFunPtr, class Parm1, class Parm2 >
class MemberFunctor2 : public Functor
{
public:
    MemberFunctor2
        (
        const CalleePtr & pCallee,
        const MemFunPtr & pFunction,
        Parm1 aParm1,
        Parm2 aParm2
        ) :
        pCallee(pCallee),
        pFunction(pFunction),
        aParm1(aParm1),
        aParm2(aParm2)
    {
    }

    virtual void operator()()
    {
        if ((pCallee != NULL) &&
            (pFunction != NULL))
        {
            ((*pCallee).*pFunction)(aParm1, aParm2);
        }
    }

private:
    CalleePtr pCallee;
    MemFunPtr pFunction;
    Parm1 aParm1;
    Parm2 aParm2;
};

template< class CalleePtr, class Callee, class Ret, class Type1, class Parm1 >
inline Functor * DeferCall
(
const CalleePtr & pCallee,
Ret(Callee::*pFunction)(Type1),
const Parm1 & rParm1
)
{
    return new
        MemberFunctor1< CalleePtr,
        Ret(Callee::*)(Type1), Parm1 >
        (pCallee, pFunction, rParm1);
}

template< class CalleePtr, class Callee, class Ret, class Type1, class Parm1, class Parm2>
Functor * DeferCall2
(
    const CalleePtr & pCallee,
    Ret(Callee::*pFunction)(Type1),
    const Parm1 & rParm1,
    const Parm2 & rParm2
)
{
    return new
        MemberFunctor2< CalleePtr,
        Ret(Callee::*)(Type1), Parm1, Parm2 >
        (pCallee, pFunction, rParm1, rParm2);
}

class TestObj
{
public:
    void test1 (int a)
    {
        printf("test 1 a=%d\r\n", a);
    }

    void test2 (int a, int b)
    {
        printf("test 2 a=%d, b=%d\r\n", a, b);
    }

    void test (void)
    {
        Functor * pCall = DeferCall(this, &TestObj::test1, 3);

        Functor * pCall1 = new MemberFunctor1 < TestObj *, void (TestObj::*)(int), int >(this, &TestObj::test1, 6);

        Functor * pCall2 = new MemberFunctor2 < TestObj *, void (TestObj::*)(int, int), int,  int >(this, &TestObj::test2, 4, 5);

        Functor * pCall3 = DeferCall2(this, &TestObj::test2, 3, 3); // Compile time error.

        if (pCall)
            (*pCall)();
        if (pCall1)
            (*pCall1)();
        if (pCall2)
            (*pCall2)();
        if (pCall3)
            (*pCall3)();

        delete pCall;
        delete pCall1;
        delete pCall2;
        delete pCall3;
    }
};


int _tmain(int argc, _TCHAR* argv[])
{
    TestObj *obj = new TestObj();
    obj->test();
    delete obj;

    return 0;
}

I have a situation (on an embedded system) where I want call functions from another task. I found this method to do so http://www.drdobbs.com/elegant-function-call-wrappers/184401385 . But I what to do so with more arguments. Best case I have a solution where this is in the template to, but I have no clue how to realise that. Anyway, it is also possible to create two temples as shown below (in a small visual studio C++ test). Everything function fine, except the DeferCall2 call that give a compile time error. What mistake I made here?

#include "stdafx.h"
#include "stdlib.h"
#include "stdio.h"



class Functor
{
public:
    virtual ~Functor() {}
    virtual void operator()() = 0;
};
template< class CalleePtr, class MemFunPtr, class Parm1 >
class MemberFunctor1 : public Functor
{
public:
    MemberFunctor1
        (
        const CalleePtr & pCallee,
        const MemFunPtr & pFunction,
        Parm1 aParm1
        ) :
        pCallee(pCallee),
        pFunction(pFunction),
        aParm1(aParm1)
    {
    }

    virtual void operator()()
    {
        if ((pCallee != NULL) &&
            (pFunction != NULL))
        {
            ((*pCallee).*pFunction)(aParm1);
        }
    }

private:
    CalleePtr pCallee;
    MemFunPtr pFunction;
    Parm1 aParm1;
};

template< class CalleePtr, class MemFunPtr, class Parm1, class Parm2 >
class MemberFunctor2 : public Functor
{
public:
    MemberFunctor2
        (
        const CalleePtr & pCallee,
        const MemFunPtr & pFunction,
        Parm1 aParm1,
        Parm2 aParm2
        ) :
        pCallee(pCallee),
        pFunction(pFunction),
        aParm1(aParm1),
        aParm2(aParm2)
    {
    }

    virtual void operator()()
    {
        if ((pCallee != NULL) &&
            (pFunction != NULL))
        {
            ((*pCallee).*pFunction)(aParm1, aParm2);
        }
    }

private:
    CalleePtr pCallee;
    MemFunPtr pFunction;
    Parm1 aParm1;
    Parm2 aParm2;
};

template< class CalleePtr, class Callee, class Ret, class Type1, class Parm1 >
inline Functor * DeferCall
(
const CalleePtr & pCallee,
Ret(Callee::*pFunction)(Type1),
const Parm1 & rParm1
)
{
    return new
        MemberFunctor1< CalleePtr,
        Ret(Callee::*)(Type1), Parm1 >
        (pCallee, pFunction, rParm1);
}

template< class CalleePtr, class Callee, class Ret, class Type1, class Parm1, class Parm2>
Functor * DeferCall2
(
    const CalleePtr & pCallee,
    Ret(Callee::*pFunction)(Type1),
    const Parm1 & rParm1,
    const Parm2 & rParm2
)
{
    return new
        MemberFunctor2< CalleePtr,
        Ret(Callee::*)(Type1), Parm1, Parm2 >
        (pCallee, pFunction, rParm1, rParm2);
}

class TestObj
{
public:
    void test1 (int a)
    {
        printf("test 1 a=%d\r\n", a);
    }

    void test2 (int a, int b)
    {
        printf("test 2 a=%d, b=%d\r\n", a, b);
    }

    void test (void)
    {
        Functor * pCall = DeferCall(this, &TestObj::test1, 3);

        Functor * pCall1 = new MemberFunctor1 < TestObj *, void (TestObj::*)(int), int >(this, &TestObj::test1, 6);

        Functor * pCall2 = new MemberFunctor2 < TestObj *, void (TestObj::*)(int, int), int,  int >(this, &TestObj::test2, 4, 5);

        Functor * pCall3 = DeferCall2(this, &TestObj::test2, 3, 3); // Compile time error.

        if (pCall)
            (*pCall)();
        if (pCall1)
            (*pCall1)();
        if (pCall2)
            (*pCall2)();
        if (pCall3)
            (*pCall3)();

        delete pCall;
        delete pCall1;
        delete pCall2;
        delete pCall3;
    }
};


int _tmain(int argc, _TCHAR* argv[])
{
    TestObj *obj = new TestObj();
    obj->test();
    delete obj;

    return 0;
}

原文:https://stackoverflow.com/questions/35798097
更新时间:2021-12-20 07:12

最满意答案

您确实应该使用$1 ,但是当您尝试运行脚本时,只需使用./your_script.sh your_argument不要在开头添加%


You should indeed use $1, but when you try to run your script just use ./your_script.sh your_argument don't add the % in the beginning.

相关问答

更多

相关文章

更多

最新问答

更多
  • h2元素推动其他h2和div。(h2 element pushing other h2 and div down. two divs, two headers, and they're wrapped within a parent div)
  • 创建一个功能(Create a function)
  • 我投了份简历,是电脑编程方面的学徒,面试时说要培训三个月,前面
  • PDO语句不显示获取的结果(PDOstatement not displaying fetched results)
  • Qt冻结循环的原因?(Qt freezing cause of the loop?)
  • TableView重复youtube-api结果(TableView Repeating youtube-api result)
  • 如何使用自由职业者帐户登录我的php网站?(How can I login into my php website using freelancer account? [closed])
  • SQL Server 2014版本支持的最大数据库数(Maximum number of databases supported by SQL Server 2014 editions)
  • 我如何获得DynamicJasper 3.1.2(或更高版本)的Maven仓库?(How do I get the maven repository for DynamicJasper 3.1.2 (or higher)?)
  • 以编程方式创建UITableView(Creating a UITableView Programmatically)
  • 如何打破按钮上的生命周期循环(How to break do-while loop on button)
  • C#使用EF访问MVC上的部分类的自定义属性(C# access custom attributes of a partial class on MVC with EF)
  • 如何获得facebook app的publish_stream权限?(How to get publish_stream permissions for facebook app?)
  • 如何防止调用冗余函数的postgres视图(how to prevent postgres views calling redundant functions)
  • Sql Server在欧洲获取当前日期时间(Sql Server get current date time in Europe)
  • 设置kotlin扩展名(Setting a kotlin extension)
  • 如何并排放置两个元件?(How to position two elements side by side?)
  • 如何在vim中启用python3?(How to enable python3 in vim?)
  • 在MySQL和/或多列中使用多个表用于Rails应用程序(Using multiple tables in MySQL and/or multiple columns for a Rails application)
  • 如何隐藏谷歌地图上的登录按钮?(How to hide the Sign in button from Google maps?)
  • Mysql左连接旋转90°表(Mysql Left join rotate 90° table)
  • dedecms如何安装?
  • 在哪儿学计算机最好?
  • 学php哪个的书 最好,本人菜鸟
  • 触摸时不要突出显示表格视图行(Do not highlight table view row when touched)
  • 如何覆盖错误堆栈getter(How to override Error stack getter)
  • 带有ImageMagick和许多图像的GIF动画(GIF animation with ImageMagick and many images)
  • USSD INTERFACE - > java web应用程序通信(USSD INTERFACE -> java web app communication)
  • 电脑高中毕业学习去哪里培训
  • 正则表达式验证SMTP响应(Regex to validate SMTP Responses)