首页 > 解决方案 > 自动化方法调用 C++

问题描述

我正在开发 C++11 应用程序。我有一个方法会被调用很多次(1000)。该方法接受字符串和函数指针作为参数。

问题是指向函数的指针将采用不同类型的参数,有时是 int,有时是 std:string 等等。

为了避免对我的方法进行 1000 次不同的调用,我想用字符串和指向函数的指针构建一个 std::pairs 列表并遍历它来调用我的方法。

但我还没有找到一种干净的方法来实现这一目标。

例子:

// This is the method I want to call, 
// T is function pointer, I have several versions for
// different data types, e.g here bool version
template <class T>
void myMethod(const std::string& strArg,
              void (T::*setter) (const bool)) const

先前的方法将使用不同的参数调用 1000 次:每个字符串对应于唯一的函数指针。

现在我将其称为 1000 次,例如:

myMethod(str1, pFunction1);
myMethod(str2, pFunction2);
myMethod(str3, pFunction3);
...
myMethod(str1000, pFunction1000);

我想,首先创建一个由我手动填写的列表:

std::list<std::pair<str, functionPointer>>

然后我会为列表中的每个成员迭代调用我的方法

请问有什么想法吗?

谢谢并恭祝安康

标签: c++11function-pointersstd-pair

解决方案


我希望您稍后再调用您的函数!

假设我们可以编写您想要的代码(伪代码):

std::list<std::pair<str, PointerToFunctionWithAnySignature >> ptrList;

现在你填写清单

ptrList.add( "bla", Do1 );
ptrList.add( "blub", Do2 );

函数的签名如下:

void Do1(int);
void Do2(float, std::string& );

现在您要遍历列表:

for ( auto& el: ptrList )
{
    // here we want to call the function:
    el.second( ???????? );
}

这就是问题所在!如果您有不同的签名:您如何知道必须在该调用中的哪个位置填写哪个参数。

结果,即使您能够存储指向具有不同签名的函数的指针,也没有任何意义,因为您无法调用它们!

如果您已经知道以后调用的参数,则可以使用lambda functions将函数和参数存储为单个对象,并使其可通过唯一签名进行调用。您也可以为此使用 std::bind,但首选 lambda,更易于处理且更易于阅读。


推荐阅读