代码之家  ›  专栏  ›  技术社区  ›  RuLoViC

调用C++的自动化方法

  •  0
  • RuLoViC  · 技术社区  · 6 年前

    我正在研究C++ 11的应用程序。在这里,我有一个方法将被多次调用(1000)。该方法接受作为参数字符串和指向函数的指针。

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

    为了避免对我的方法有1000种不同的调用,我有一个建立一个STD::用字符串和指针指向函数的列表,并通过迭代来调用我的方法。

    但我还没有找到一个明确的方法来实现这一点。

    例子:

    // 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 回复  |  直到 6 年前
        1
  •  1
  •   Caleth    6 年前

    是的,你可以收集这样的一对。

    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>
    }
    

    但听起来这些电话你有不同的类型。你可以收集 std::function<void()> s由lambda制成,每个都有不同的 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();
    }
    
        2
  •  2
  •   Klaus    6 年前

    我希望你能在以后调用函数时做到这一点!

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

    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::绑定,但lambda是首选,更容易处理和更简单的阅读。