绑定实用程序和模板化函数

Bind utility and templated functions

本文关键字:函数 实用程序 绑定      更新时间:2023-10-16

它遵循了一个使用中的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