接受任意数量的回调并存储结果的c++类方法

标签 c++ callback std

我一直在想办法让我的类方法接受任意数量的回调函数,运行所有回调函数,然后存储输出。我认为这行得通,但是有没有一种方法可以做到这一点,而不必让用户将所有回调函数包装到一个 vector 中?这也只是感觉凌乱。随意提及其他不理想的地方。

#include <iostream>
#include <functional>
#include <vector>

class MyObj{
public:
    // where I store stuff
    std::vector<double> myResults;

    // function that is called intermittently
    void runFuncs(const std::vector<std::function<double()> >& fs){
        if ( myResults.size() == 0){
            for( auto& f : fs){
                myResults.push_back(f());
            }
        }else{
            int i (0);
            for( auto& f : fs){
                myResults[i] = f();
                i++;
            }
        }
    }

};


int main(int argc, char **argv)
{

    auto lambda1 = [](){ return 1.0;};
    auto lambda2 = [](){ return 2.0;};

    MyObj myThing;

    std::vector<std::function<double()> > funcs;
    funcs.push_back(lambda1);
    funcs.push_back(lambda2);
    myThing.runFuncs(funcs);

    std::cout << myThing.myResults[0] << "\n";
    std::cout << myThing.myResults[1] << "\n";

    std::vector<std::function<double()> > funcs2;
    funcs2.push_back(lambda2);
    funcs2.push_back(lambda1);
    myThing.runFuncs(funcs2);

    std::cout << myThing.myResults[0] << "\n";
    std::cout << myThing.myResults[1] << "\n";


    return 0;
}

最佳答案

可能是这样的:

template <typename... Fs>
void runFuncs(Fs... fs) {
  myResults = std::vector<double>({fs()...});
}

那么你可以称它为

myThing.runFuncs(lambda1, lambda2);

Demo

关于接受任意数量的回调并存储结果的c++类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46637503/

相关文章:

C++ char * 转字符串

c++ - std::vector::push_back 参数引用

c++ - 如何在 Linux 系统上以编程方式清除 C++ 中的文件系统内存缓存?

C++ 单例线程问题

javascript - jQuery.ajax - 可以为每个 ajax 请求触发两个成功回调吗?

c++ - 使用 std::vector 的链接错误

c++ - 我的 C++ 程序应该支持 IA64 还是只支持 x64?

c++ - 为什么这个循环每次迭代需要 1.32 个周期

c++ - 我在哪里设置内存屏障以便条件循环观察多线程值变化?

android - notifyDataSetChanged 后 "The specified child already has a parent"