#include <iostream>
#include <boost/bind.hpp>
struct FCall3Templ {
template<typename ARG1, typename ARG2>
ARG1 operator()(ARG1 arg1, ARG2 arg2) {
return arg1+arg2;
}
};
int main() {
boost::bind<int>(FCall3Templ(), 45, 56)(); // call 1
boost::bind<double>(FCall3Templ(), 45.0, 56.0)(); // call 2
return 0;
}
我发布的代码与您可以找到的代码相同 here .
我对元编程、boost::bind 和运算符重载比较陌生,但我不明白这段代码在代码的某些部分做了什么,我有以下问题:
- 为什么使用
operator()
而不指定该运算符的标签?什么是重载/定义? - 我应该如何使用
T var = ?
的赋值来捕获和存储 2 个调用返回的值? - 最后一个
()
在两个调用中都是空的,这意味着什么?是接线员的电话吗?那么这种技术/运算符的名称是什么? - 为什么要以这种方式重载运算符而不是只使用一个方法?
谢谢。
最佳答案
依次回答你的问题:
1) operator()
是对象的()
运算符。例如,如果您查看 std::less 的定义,它定义了 operator()
接受两个参数并进行比较,然后返回结果。这允许你写
bool foo(int a, int b)
{
std::less<int> compare;
return compare(int a, int b);
}
2) 在这种情况下,您可以像往常一样捕获它们。
int i = boost::bind<int>(FCall3Templ(), 45, 56)(); // call 1
double d = boost::bind<double>(FCall3Templ(), 45.0, 56.0)(); // call 2
3) boost::bind
用于获取函数对象(定义了 operator()
的对象)、函数指针或可选的成员函数指针带有参数并返回一个新的函数对象(其类型很难描述),该对象在调用时使用绑定(bind)参数(以及调用期间可能的参数)。请参阅 boost::bind 的文档
在这种情况下,答案就是简单地调用 boost::bind
然后立即调用结果。第二组 ()
正在调用结果。由于所有参数都在 boost::bind
被调用时绑定(bind),因此不需要额外的参数。
4) 原因是最初的问题是问如何让 boost::bind
自动选择正确的函数模板实例化。不幸的是,当使用函数指针(包括模板函数)时,boost::bind
不能自动执行重载决策,因为它必须传递一个函数指针作为第一个参数,而且它不知道如何执行重载决议。
但是,如果给定一个仿函数,并且该函数定义了一个模板化成员函数 operator()
或者甚至是一个重载的 operator ()
,它可以执行重载决议当它被调用时。
关于带有模板、运算符重载和 boost::bind 的 C++ - 这个小代码有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11977298/