绑定实用程序和模板化函数
Bind utility and templated functions
它遵循正在使用的 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
从其参数(的类型)推导出其 return 类型,因此仅使用 fn
变得无效。要使可调用对象成为 std::bind
的第一个参数,您现在必须实例化模板 fn
.
它遵循正在使用的 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
从其参数(的类型)推导出其 return 类型,因此仅使用 fn
变得无效。要使可调用对象成为 std::bind
的第一个参数,您现在必须实例化模板 fn
.