C ++ C#delegate等效

时间:2014-07-07 12:02:34

标签: c# c++

我会尽量保持这个问题的简洁。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Something {
    static class Program {
        [STAThread]
        static void Main() {
            int blah = DoSomethingWithThis( delegate {
                Console.WriteLine( "Hello World" );
            } );
        }

        public static int DoSomethingWithThis( Action del ) {
            del.Invoke(); // Prints Hello World to the console
            int someArbitraryNumber = 31;
            return someArbitraryNumber;
        }
    }
}

在C#中我可以使用匿名方法作为参数来做这样的事情; 我想知道是否有人可以在C ++中向我展示同样的东西,或者类似的东西会促进相同的结果。我计划使用类似上面代码的东西为我的C ++游戏创建一个DisplayList生成器。

1 个答案:

答案 0 :(得分:2)

例如

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

int main() 
{
    std::vector<std::string> v = { "Hello ", "Wordl" };

    std::for_each( v.begin(), v.end(), 
                   []( const std::string &s) { std::cout << s; } )( "\n" );

    return 0;
}

输出

Hello Wordl

因此,您可以自己编写一些函数,接受函数对象(或类型为std :: function的对象)作为参数,然后传递lambda表达式作为参数。

例如

#include <iostream>
#include <string>
#include <functional>

int DoSomethingWithThis( std::function<void( void )> del )
{
    del();

    int someArbitraryNumber = 31;
    return someArbitraryNumber;
}


int main() 
{
    int blah = DoSomethingWithThis( [] { std::cout << "Hello World"; } );

    std::cout << "\nblah = " << blah << std::endl; 

    return 0;
}

输出

Hello World
blah = 31

在C#中,您也可以用匿名方法替换lambda表达式。