为函数创建模板函数,该函数接受函数指针作为许多类型函数的参数

时间:2016-08-18 02:32:33

标签: c++ templates overloading function-pointers function-declaration

除了一行上的函数外,我有几个c函数几乎完全相同。我想用一个函数替换所有这些函数,我可以将它作为该行的函数指针传递:

Func1(type parameter);

Func2(type1 parameter1,type2 parameter2);

FuncFunc(FunctionPointer functionPointer){
    funcVar;
    ...
    functionPointer(funcVar,....);
    ...
}

int main(){
    FuncFunc(Func1);

    FuncFunc(Func2(,type2Object));
}

无论如何我能用C ++做到这一点吗?

1 个答案:

答案 0 :(得分:2)

目前还不清楚您要实现的目标,但这里有一个示例,您的代码可以如何转换为有效的C ++。首先,让我们用最大数量的参数定义你的if($(this).scrollTop() + $(this).innerHeight() >= $(this)[0].clientHeight) {

Func

然后我们应该让template<typename T1, typename T2> void Func(T1 par1, T2 par2) { std::cout << par1 << " " << par2 << std::endl; } 接受你想要的任何功能:

FuncFunc

或更容易使用变体:

template<typename ...T>
void FuncFunc(const std::function<void(T...)>& fPtr) {
        std::string funcVar = "Foo!";
        fPtr(funcVar);
}

最后使用template<typename F> void GuncFunc(const F& fPtr) { std::string funcVar = "Foo!"; fPtr(funcVar); }

FuncFunc

auto Func1 = std::bind(Func<float, std::string>, 3.14f, std::placeholders::_1); auto Func2 = std::bind(Func<std::string, int>, std::placeholders::_1, 42); FuncFunc(std::function<void(std::string)>(Func1)); FuncFunc(std::function<void(std::string)>(Func2)); return 0;

GuncFunc

选择// Using std::bind GuncFunc(std::bind(Func<float, std::string>, 3.14f, std::placeholders::_1)); GuncFunc(std::bind(Func<std::string, int>, std::placeholders::_1, 42)); // Or using lambdas: GuncFunc([](std::string s){Func<float, std::string>(3.14f, s);}); GuncFunc([](std::string s){Func<std::string, int>(s, 42);}); 或lambdas似乎超出了您的问题的范围,但您可能会发现一些有用的heretherethis问题。

无论如何,您很可能需要lambdasstd::functionstd::bindvariadic templates