c++ - 为接受函数指针作为多种类型函数参数的函数创建模板函数

标签 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++ 做到这一点吗?

最佳答案

不清楚您要实现的目标,但这里有一个示例,说明您的代码可以如何转换为有效的 C++。首先,让我们用最大数量的参数定义您的 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);});

选择 std::bind 或 lambda 似乎超出了您的问题范围,但您可能会发现一些有用的东西 here , there或在 this问题。

无论如何,您很可能需要 lambdas , std::function , std::bindvariadic templates .

关于c++ - 为接受函数指针作为多种类型函数参数的函数创建模板函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39009090/

相关文章:

c++ - 为什么我总是在 C++ 套接字的服务器端接收数据?

c++ - 虚成员函数定义可以出现在类模板之外吗?

c++ - `is_base_of` 是如何工作的?

javascript - 如何在函数调用期间实现可选括号? (函数重载)

java - Java 中方法重载的确切需要

php - 从 PHP-CPP 的 Php::Value 中检索类名

c++ - 简单的语义 Action 破坏了 Spirit X3 中的结果

java - java中的泛型继承

Swift 默认重载不可用 - SCNReferenceNode(名为 : ) is not found

c++ - 从单个 *.cc* 源文件生成多个 *.oct* 文件以将 C 库连接到 Octave