1

我已经阅读了关于 lambdas、函数指针、一般匿名函数和其他相关内容的帖子/文章,但我所看到的(我认为)没有任何东西能准确地达到我想要做的事情。

看起来完成这个应该很简单,但是假设我有一个函数,其中包含我在调用时总是想做的事情,但是每次我调用它时,我都希望它运行我描述的函数(并且只需要使用一次)参数(这个匿名函数是唯一的参数)。

假设这个接受我的匿名函数作为它的参数的函数在 main.cpp 中,所以它是从 main 调用的,是否有可能以简单的方式实现它?

基本上,我试图从 C++ 中找出语法:

// Some function with partially duplicated code
void OriginalA()
{
    DoThingsA();

    // unique code

    DoThingsB();
}

// Another function with partially duplicated code
void OriginalB()
{
    DoThingsA();

    // unique code

    DoThingsB();
}

对此:

// Encapsulate shared functionality
// <param name="action">User defined action</param>
void UniqueWrapper(Action action)
{
    DoThingsA();

    action();

    DoThingsB();
}

// New implmentation of A
void NewA()
{
    UniqueWrapper(() =>
    {
        // unique code
    });
}

// New implementation of B
void NewB()
{
    UniqueWrapper(() =>
    {
        // unique code
    });
}

我在这里找到了#1:http: //www.wildbunny.co.uk/blog/2012/11/01/10-steps-to-becoming-a-better-programmer/

但是像这样的设置,实际上你只需要做的就是:

theFunctionName(() => { /*unique things to do*/ });

如果这个 ^^ 是合法的调用语法,那么我只是不确定参数在 theFunctionName 的定义中的外观,显然它不是上面示例中的 (Action action)。

4

2 回答 2

3

Action参数替换为:

template<typename Function>
void UniqueWrapper(Function action) {
  DoThingsA();
  action();  // call the passed in function
  DoThingsB();
};

像这样称呼它:

void NewA() {
  UniqueWrapper([]() {});
  //            ^^^^^^^
  //       C++11 lambda syntax
}

除了 lambda,您还可以使用函数指针、成员函数(使用std::mem_fn)或仿函数。每种可调用对象都可以工作。

于 2014-02-14T22:49:38.527 回答
1

有多种方法可以做到这一点,但并非所有方法都适用于所有平台(例如,因为它们需要 C++11 特性(lambdas)。

更经典的方法是这样的(没有匿名函数):

#include <iostream>

typedef void(*Action)();

void UniqueWrapper(Action action) {
    std::cout << "Generic Code 1" << std::endl;
    action();
    std::cout << "Generic Code 2" << std::endl;
}

void CustomAction(void) {
    std::cout << "Custom Code" << std::endl;
}

int main(int argc, char **argv) {
    UniqueWrapper(&CustomAction);
    return 0;
}

当然,您可以使用一些宏观恶作剧来使其更加“动态”。

一旦你也接受了 C++11 代码(需要有 lambdas 解释),你可以做这样的事情:

#include <iostream>

typedef void(*Action)();

void UniqueWrapper(Action action) {
    std::cout << "Generic Code 1" << std::endl;
    action();
    std::cout << "Generic Code 2" << std::endl;
}

int main(int argc, char **argv) {
    UniqueWrapper([](){
            std::cout << "Custom Code" << std::endl;
        });
    return 0;
}

当然,还有更多更改的空间,例如您可以使用std::function而不是函数指针。

于 2014-02-14T22:57:29.310 回答