c++ - 绑定(bind)实用程序和模板化函数

标签 c++ templates bind

它遵循正在使用的 bind 函数的最小示例。
它编译并且确实是一个非常简单的例子。

#include <functional>

void fn(int i) { }

int main() {
    int x = 0;
    auto f = std::bind(fn, x);
}

我有兴趣用模板函数做同样的事情。
它遵循上面的示例,尽管稍作修改。这个不编译,但它准确解释了预期的行为。

#include <functional>

template<typename T>
void fn(T t) { }

int main() {
    int x = 0;
    auto f = std::bind(fn, x);
}

一个非常简单的问题:是否可以将 bind 实用程序与模板函数一起使用?

最佳答案

我认为明显的解决方案是下面的代码。

#include <functional>

template<typename T>
void fn(T t) { }

int main() {
    int x = 0;
    auto f = std::bind(fn<int>, x);
}

如果您不想具体说明实例化,也许您可​​以再添加一个模板级别。我正在做一些测试。

编辑:我花了几个小时自己思考,谷歌搜索并阅读我打印的 TC++PL4Ed,以及阅读 GNU 的 libstdc++ 源代码的实现,但我没有想到我也没有找到如何按照您的要求进行操作。

事实证明,当您将fn 设为模板的名称时,它就不能再用作对象的名称了。由于 std::bind 从其参数(的类型)推导出其返回类型,因此仅使用 fn 变得无效。要使可调用对象成为 std::bind 的第一个参数,您现在必须实例化模板 fn

关于c++ - 绑定(bind)实用程序和模板化函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34123005/

相关文章:

c++ - 模板类之间的可见性

javascript - 使用 jQuery 每次突发事件运行一次函数

c++ - 类前向声明

c++ - 使用给定的参数包消除重载函数的歧义

c++ - 在 Windows 中平滑调整窗口大小(使用 Direct2D 1.1)?

c++ - 通用容器清除过程中的异常,C++

java - 如何将 JavaFX 8 对象绑定(bind)到 java 变量?

javascript - 绑定(bind)数组中不同元素的值 (JavaScript)

c++ - 使 CNG 加密 API 在 Windows XP 上工作?

c++ - 避免模​​板扩散