C#中有没有办法扩展如下的函数?
void foo()
{
// function body, instructions
return;
}
然后代码中的其他地方
foo += (x) => { // some functionality }
实际上,在foo()
执行结束时会添加要触发的lambda功能。
答案 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
请注意,除其他外,我无法处理删除( - =)...