首页 > 解决方案 > 为什么我们在给出模板类型时需要加上括号

问题描述

您好我正在尝试理解这段代码:

vector<int> a = {5, 3, 6, 1, 7};
sort(a.begin(), a.end(), greater<int>());
for(int i : a) cout << i << " "; cout << endl;

为什么我需要在更大的后面加上括号。这个更大的结构是这样定义的:

/// One of the @link comparison_functors comparison functors@endlink.
  template<typename _Tp>
    struct greater : public binary_function<_Tp, _Tp, bool>
    {
      _GLIBCXX14_CONSTEXPR
      bool
      operator()(const _Tp& __x, const _Tp& __y) const
      { return __x > __y; }
    };

这是stl_function.h在 c++ 中定义的。现在我认为它的工作方式是为此提供一个新类型或模板。比较文件将生成 this 的对象,然后通过operator overloading()它将执行 object_name(int_value_1, int_value_2) 并且这将返回一个 bool 并且一切都可以理解。但是()当我在模板中发送这个时为什么会出现这些。我认为这是实施的方式是否存在一些缺陷?

PS:我说对象是一个特定于类的术语,但我认为在结构中,它可能在 C++ 中这样称呼。

标签: c++templates

解决方案


为什么我们需要在给模板类型时加上括号 sort(a.begin(), a.end(), greater());

std::greater是一个类模板。std::greater<int>是该类模板的一个实例,并且是一个类型(更具体地说,是一个类类型)。std::greater<int>()是一个临时对象(模板实例类型的实例)。括号是值初始化的语法。

不能将类型作为参数传递给函数(但是,可以将类型作为模板参数传递给函数模板)。可以将临时对象作为参数传递给函数。

因此,我们使用括号来创建一个作为参数传递的对象。

PS:我说对象是一个特定于类的术语,但我认为在结构中,它可能在 C++ 中这样称呼。

如果结构是指结构:结构是类(已使用 class-key 声明struct)。

所有类型的实例都是 C++ 中的对象。


推荐阅读