c++ - 自动将一种 C++ 类型转换为另一种

标签 c++ opencv type-conversion

我正在努力简化自定义类和 OpenCV 之间的转换。

Converting constructors允许我们在没有 explicit 关键字的情况下声明一个类,并从替代数据类型构造。

例如,我们可以声明两个类:

class Foo
{
public:
    std::vector<int32_t> data;

    Foo(int k) : data(k) {}
};

class FooProxy : public cv::Mat
{
public:
    FooProxy(const Foo & foo) :  cv::Mat(foo.data.size(), 1, CV_32SC1, (void*)foo.data.data()) {}
};

然后我们可以创建一个 FooProxy,方法是将它设置为相等,然后使用我们想要的任何 OpenCV 函数:

Foo myFoo(3);
myFoo.data = { 1,2,3 };

FooProxy fp = myFoo;
fp.setTo(1);
float myNorm = cv::norm(fp);

std::cout <<  "myFoo: " << myFoo.data.at(0) << ", " << myFoo.data.at(1) << ", " << myFoo.data.at(2) << "\n";
std::cout << "fp: " << fp.at<int32_t>(0) << ", " << fp.at<int32_t>(1) << ", " << fp.at<int32_t>(2) << "\n";
std::cout << "The Norm is: " << myNorm << "\n";

输出:

myFoo: 1, 1, 1
fp: 1, 1, 1
The Norm is: 1.73205

但是,我更愿意这样写:

float myNorm = cv::norm(myFoo);

并让 C++ 自动转换 myFoo。这可能吗?

这个有效:

 float myNorm2 = cv::norm(FooProxy(myFoo));

但不是更简单的版本。

最佳答案

您可以创建一个 conversion operator

class Foo
{
  ...

  operator cv::Mat()
  {
    return cv::Mat(data.size(), 1, CV_32SC1, (void*)data.data());
  }
};

编辑 cv::norm 具有以下重载(注意没有cv::Mat):

cv::norm(const Matx< _Tp, m, n > &M)
cv::norm(const Matx< _Tp, m, n > &M, int normType)
cv::norm(InputArray src1, int normType=NORM_L2, InputArray mask=noArray()) // this is the one we want
cv::norm(InputArray src1, InputArray src2, int normType=NORM_L2, InputArray mask=noArray())
cv::norm(const SparseMat &src, int normType)

cv::InputArray 可以从 cv::Mat 构造,但是您只允许隐式进行 1 个用户定义的转换。因此,如果您希望 Foocv::norm 一起工作,您实际上需要一个用于 cv::InputArray 的转换运算符。

关于c++ - 自动将一种 C++ 类型转换为另一种,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48292376/

相关文章:

python - 是否可以强制 Numpy 在进行类型转换时使用 cutout 而不是溢出?

C++ VB6接口(interface)问题

c++ - 不存在从 "const std::string"到 "time_t"的合适转换函数

python - OpenCV 轮廓搜索和边界矩形创建算法

c++ - OpenCV:使用 drawContours() 断言失败

opencv - 如何在 opencv 中执行 dft 后显示复数值

c# - 字典到条件匹配的键列表

c++ - c++ 类实例成员是如何在机器级别传递的?

c++ - CComPtr 的 vector 还需要 CAdapt 吗?

ios - 当超过 20 位的大整数时,为什么 Swift 5 String(Int) 会失败?