将C ++函数作为参数传递而没有函数指针/内联?

时间:2014-11-24 10:31:08

标签: c++ function templates

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

我发现了这个:

Pass a function as an explicit template parameter

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

编辑:我真的非常希望避免创建结构来存储每个函数参数的行为。

1 个答案:

答案 0 :(得分: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(); } );