【问题标题】:Passing C++ functions as arguments without function pointer/inlined?在没有函数指针/内联的情况下将 C++ 函数作为参数传递?
【发布时间】:2014-11-24 10:31:07
【问题描述】:

在不使用函数指针的情况下,将函数(具有相同的输入参数/返回类型)作为参数传递给另一个函数的正确方法是什么?我希望传入的函数参数在调用时被内联?好吧,我只是不想要指针间接。

我发现了这个:

Pass a function as an explicit template parameter

但它似乎在使用函数指针。

编辑:我真的很想避免创建结构来存储每个函数参数的行为。

【问题讨论】:

    标签: c++ function templates


    【解决方案1】:

    如果你在编译时知道特化,你只需要传递类型信息:

    void inlined_function() {}; // function you want to pass
    
    template<typename F> void caller1() {
        inlined_function(); // not passed through pointer, call inline
    }
    

    如果您可以控制内联函数,请将其实现为仿函数:

    struct X {
        inline void operator()() // inline function
        {
        }
    };
    
    template<typename F> void caller2(F functor) {
        functor(); // inline call
    }
    

    两种变体的客户端代码:

    caller1<inlined_function>();
    caller2(X{});
    

    编辑

    如果您无法控制将函子编写为结构,请为其编写内联结构包装器。

    例如,你有void inlined_function() {};,需要写caller2。在这种情况下,编写一个类似于X 的函子,它调用inlined_function,或者(更好)一个lambda:

    template<typename F> void caller2(F functor) {
        functor(); // inline call
    }
    
    caller2( [](){ inlined_functor(); } );
    

    【讨论】:

    • 嘿,我喜欢你的编辑想法。所以 inlined_functor() 也可以有 inlined_functor2() 并且这些仍然是同一类中的普通方法?
    • @user997112 - 是的。内联函数相互调用会导致内联操作。
    猜你喜欢
    • 1970-01-01
    • 2022-01-20
    • 2020-11-08
    • 1970-01-01
    • 1970-01-01
    • 2019-08-17
    • 2023-03-04
    • 1970-01-01
    • 2021-12-18
    相关资源
    最近更新 更多