带有模板、运算符重载和 boost::bind 的 C++ - 这个小代码有什么作用?

标签 c++ templates operator-overloading boost-bind

#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/

相关文章:

C++平面球体碰撞检测

c++ - flood fill 获取和 RGB 值

c++ - std::find 有两种不同的类型

python - Tkinter 确认按钮和游戏 GUI(拼接(?))

c++ - 为什么我收到以下错误 : "no match for ' operator= ='" ?(带有模板的嵌套类)

swift - 创建带参数的中缀运算符

c++ - Allegro pong 碰撞问题

c++ - 按位移位使用什么整数类型作为移位大小?

c++ - 这是从容器中获取随机元素的 OK 范围方法吗?

c++ - 用模板函数重载模板类