为现有函数添加功能(C#,C ++)

时间:2016-08-28 18:46:25

标签: c# c++ delegates

C#中有没有办法扩展如下的函数?

void foo()
{
    // function body, instructions

    return;
}

然后代码中的其他地方

foo += (x) => { // some functionality }

实际上,在foo()执行结束时会添加要触发的lambda功能。

  • 这种机制的名称和内部细节是什么?
  • C ++中有这种性质的东西吗?

2 个答案:

答案 0 :(得分:3)

您的示例不会使用以下消息进行编译:

error CS1656: Cannot assign to 'foo' because it is a 'method group'

不可能做那样的事情。你看到的可能是operator += for events。这是一个example with a lambda

关于C ++

无法在不同函数的末尾添加调用(与C#相同)。但是你可以为你的事件实现事件和重载operator + =来接受函数的指针。

答案 1 :(得分:1)

只是向您展示一分钟的试验可以给您一个洞察力。但正如Kirill Daybov在他的一条评论中提到的,我鼓励你去谷歌委托c ++ ,你会发现有更强大的技术提示的文章

#include <iostream>
#include <list>
#include <functional>  //c++11

using namespace std;

//For exercice only, C++11 required
template<typename U> class naive_delegate
{
    list<function<void(U)>>_list;

    public:
    naive_delegate<U> & operator+= (function<void(U)> && fref)
    { _list.push_back(fref); return *this;}
    void operator()(U && input_param)
    {
        if (_list.empty() )
            cout << "Nothing to do for call of delegate with param " << input_param << endl;
        else
            for ( const auto & elem : _list)
                elem(input_param);
    }
};
void anwser(int i)     { cout << "The answer is " << i << endl;     }

int main()
{
    naive_delegate<int> ndel;

    ndel(1);

    ndel += [](int i) { cout << "What is the answer ? " << endl; };
    ndel += anwser;

    ndel(42);

    return 0;
}

结果

Nothing to do for call of delegate with param 1
What is the answer ?
The answer is 42

请注意,除其他外,我无法处理删除( - =)...