我正在研究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>>
然后,我将为列表中的每个成员重复调用我的方法
有什么想法吗?
感谢和问候
答案 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();
}