【问题标题】:Understanding the usage of the syntax "<DataType>" in C++了解 C++ 中语法“<DataType>”的用法
【发布时间】:2021-11-22 13:08:57
【问题描述】:

我想了解“&lt;DataType&gt;”在 C++ 中的用法。 据我了解,它是用于模板的语法,它使用指定的数据类型来专门化函数或类实例化。

来自python,我知道所有数据类型都定义为一个类(如果它不适用于C++,请纠正我),所以如果你在python中寻找int实现,你会发现:

class int: 
    @overload 
    def __new__(cls: Type[_T], x: str | bytes | SupportsInt | SupportsIndex | _SupportsTrunc = ...) -> _T: ...
 ... 

根据参数重载哪个构造函数。那么为什么在 C++ 中它不使用 (dataType) 而不是 &lt;dataType&gt; 并根据参数的类型重载构造函数呢?

另外,我可以肯定地说,每次出现&lt;DataType&gt;,它肯定是一个模板吗?

一些例子:

std::vector<int> x;
std::vector< std::vector<int> >& someVar;

cv::Mat opencvMat;
int x = static_cast<int>(opencvMat.at<float>(i, 3) * frameWidth);

【问题讨论】:

  • 来自 python,我知道所有数据类型根据定义都是一个类(如果它不适用于 c++,请纠正我) 这不适用于 C 或 C++。听起来你可以使用good C++ book
  • 为什么一种语言和另一种语言做事不同?好吧,因为它们是不同的语言。向量是类模板,static_cast 和 .at(来自 opencvMat)是模板函数
  • 如果你确定&lt;DataType&gt; 中的DataType 是一个类型而不是一个变量,我认为说它是一个模板是很安全的。否则它可能是一个表达式。 a&lt;foo&gt;b 其中a&lt;foo 产生bool 并且有一个运算符可以让您执行bool &gt; decltype(b)
  • @P Kramer,我没有问为什么它与 python 不同,我只是举了一个例子来问为什么不简单地使用重载(比如在 python 甚至 c 中)。无论如何,感谢您指出我的示例都是模板。

标签: c++ opencv templates


【解决方案1】:

我会用你的例子:

std::vector<int> x;

x 是一个包含整数的向量(动态长度数组)。

std::vector< std::vector<int> >& someVar;

someVar 是对向量向量的引用。内部向量包含整数。这是引用二维动态数组的常用方法,其中每一行可以有不同的列数。

int x = static_cast<int>(opencvMat.at<float>(i, 3) * frameWidth);

这就是你如何进行各种风格的演员表。我将它分成两部分:

opencvMat.at<float>(i, 3)

我不使用这个库,但 at 方法可能是一个模板,这意味着你将收到一个浮点数。

static_cast 将计算值强制为 int,而不会因精度损失而发出编译器警告。

正如您所知道的,这都与模板有关,您会看到模板是使用 定义的。例如:

template <class ObjectType>
class Foo:
public:
     ObjectType value;
};

Foo<std::string> myFoo;

在这种情况下,myFoo.value 是一个字符串。

【讨论】:

  • 注意:OpenCV 知道其 Mat 的元素类型,但这不是类型安全的(编码为对象中的枚举)。 at&lt;&gt;() 方法必须被赋予 C++ 元素类型。如果该类型与实际存储在内存中的内容匹配,您将得到垃圾。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-08
  • 2012-07-07
  • 2022-10-21
  • 1970-01-01
  • 2015-05-03
  • 1970-01-01
  • 2015-03-21
相关资源
最近更新 更多