自动调用C ++的方法

时间:2018-07-27 12:36:32

标签: c++11 function-pointers std-pair

我正在研究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>>

然后,我将为列表中的每个成员重复调用我的方法

有什么想法吗?

感谢和问候

2 个答案:

答案 0 :(得分:2)

希望您以后要调用函数!

假设我们可以编写所需的代码(伪代码):

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,它更易于处理且更易于阅读。

答案 1 :(得分:1)

是的,您可以收集此类对。

std::vector<std::pair<std::string, void (SomeClass::*) (const bool)>> myMethodArgs 
{
    { str1, pFunction1 },
    { str2, pFunction2 },
    ...
    { str1000, pFunction1000 },
};

然后全部叫起

for (auto & pair : myMethodArgs)
{
     myMethod(pair.first, pair.second); // deduces myMethod<SomeClass>
}

但是听起来您在许多此类呼叫中具有不同的类型。取而代之的是,您可以有一个由lambda组成的std::function<void()>集合,每个集合都有一个不同的myMethod实例化

std::vector<std::function<void()>> myMethodCalls
{
    []{ myMethod(str1, &Class1::method); },
    []{ myMethod(str2, &Class2::other_method); },
    ...
    []{ myMethod(str1000, &Class1000::final_method); },
};

for (auto & call : myMethodCalls)
{
    call();
}