c++ - 为什么我们在给出模板类型时需要加上括号
问题描述
您好我正在尝试理解这段代码:
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++ 中这样称呼。
解决方案
为什么我们需要在给模板类型时加上括号 sort(a.begin(), a.end(), greater());
std::greater
是一个类模板。std::greater<int>
是该类模板的一个实例,并且是一个类型(更具体地说,是一个类类型)。std::greater<int>()
是一个临时对象(模板实例类型的实例)。括号是值初始化的语法。
不能将类型作为参数传递给函数(但是,可以将类型作为模板参数传递给函数模板)。可以将临时对象作为参数传递给函数。
因此,我们使用括号来创建一个作为参数传递的对象。
PS:我说对象是一个特定于类的术语,但我认为在结构中,它可能在 C++ 中这样称呼。
如果结构是指结构:结构是类(已使用 class-key 声明struct
)。
所有类型的实例都是 C++ 中的对象。
推荐阅读
- kubernetes - 从 kubernetes secret 导入数据到配置映射
- ios - 如何提高 NSTextStorage addAttribute 性能
- python - python中等值函数的机制
- javascript - 标记和圆形标记具有不同的视觉位置
- python - 在列表中拆分列表
- python - 有没有办法在保持比率的同时插入值?
- windows - 得到“只有当它们都位于同一个文件夹中时,您才能选择多个项目”错误
- javascript - JQuery函数没有响应按钮之间的导航
- javascript - 无法使用 JS Ajax 启用禁用提交(由 php 回显提交)
- php - 从 Laravel 中的存储档位生成带有动态图像的 PDF