繁体   English   中英

c++ 如何在没有模板的情况下为 lambda function 保存 function 返回类型?

[英]c++ How can i save function return type for lambda function without template?

我正在尝试创建 class 可以保存 function 指针、arguments 和返回类型

我的 class 保存 function

// Here i can't pass temlpate because next step for me is creating array of CFnSaver ('std::vector<CFnSaver*>')
// template<typename T>
class CFnSaver
{
public:
    // i can't use template here, compiler throw an error
    // template<typename T>
    std::function<int()> savedFn;

    template<typename ... Args>
    constexpr bool Save(void* pFn, Args ... args)
    {
        if (!pFn) return false;

        // creating lambda function
        auto lambdaFn = [pFn, args...]()
        {
            // I need to get function return type, not just hardcode 'int' (as i did)
            using tempFn = int(*)(Args ...);
            auto tempFunc = reinterpret_cast<tempFn>(pFn);
            return tempFunc(args...);
        };

        // Here i can call original function and get result, e.g. '5', but i don't need it here
        // auto res = lambdaFn(); 

        // saving lambda to std::function
        savedFn = lambdaFn;

        return !!savedFn;
    }


    inline CFnSaver() {};

    template<typename ... Args>
    inline CFnSaver(void* pFn, Args ... args) { Save(pFn, args...); }

    bool const operator ! () const { return(!savedFn); }

    explicit operator bool() const { return !!savedFn; }
};

使用示例:

int printSum(int a, int b)
{
    int sum = a + b;
    printf_s("%d\n", sum);
    return sum;
}

int main()
{
    CFnSaver cfn(printSum, 2, 3);

    // I need to get return of this function (now it's hardcoded to int)
    auto res = cfn.savedFn();

    return 0;
}

我还可以创建另一个版本的 function,将另一个变量作为 ref 传递。 但我对此并不满意。

void printSum(int a, int b, int& result)
{
    int sum = a + b;
    printf_s("%d\n", sum);
    result = sum;
}

int main()
{
    int result = 0;
    CFnSaver cfn(printSum, 2, 3, result);
    cfn.savedFn();

    return 0;
}

我想我需要另一种方法来保存 function 或者我错过了一些方法来做到这一点,我们将不胜感激。

对不起,我的英语不好。

我试过模板 class、模板 function,将变量作为 ref 传递。

可悲的是,我认为不使用模板是不可能的。

我的建议是不要使用保存函数的数组,而是创建一个 lambda 来调用它们并使用它。 lambda 甚至可以采用布尔值数组来指定是否在必要时调用特定函数。

编辑:

如果返回类型相同,或者函数可以分组到具有相同返回类型的列表中,则可以使用std::bind 如果:

std::vector<std::function<int()> vec {
    AddNumbers, // AddNumbers(int, int) adds two numbers
    std::bind(AddNumbers, std::placeholders::_1, 3) // Adds three to a number, usage example: vec[1](2); would return 5
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM