【问题标题】:Returning a pointer to array of fixed sized arrays C++返回指向固定大小数组C ++的数组的指针
【发布时间】:2015-05-24 12:07:25
【问题描述】:

我尝试到处搜索,但因为这是一个如此令人困惑的问题,我无法找到我正在寻找的东西。我正在尝试创建函数/方法,但我不知道如何指定其返回类型,应该是:

double(*)[3]

我希望能够使用这样的查询:

double R[3][3];
query ( &output, R );

但不是R[3][3],我有一个向量std::vector<double> R_vect (9);,我这样做:

query ( &output, reinterpret_cast<double(*)[3]> (R_vect.data()) );

这是一团糟,所以我想实现一个让它可读的函数,比如:

ReturnType Cast ( const std::vector<double>& R_vect ) {
  return reinterpret_cast<double(*)[3]> (R_vect.data());
}

但我无法指定返回类型。 我使用了 typedef,它可以工作:

typedef double DesiredCast[3];
DesiredCast* Cast ( ... ) { ... }

但我仍然很好奇如何在没有 typedef 的情况下做到这一点。

【问题讨论】:

  • 我会返回一个 a class 的实例,而不是返回一个原始指针。
  • 在使用数组或函数的指针或引用时始终使用 typedef。如果你不这样做,它就会变得如此之快。
  • 是否有关于如何命名这些 typedef 以明确其用途的建议?

标签: c++ arrays c++11


【解决方案1】:

这是相当奇怪的语法:

double (*foo(void))[3]
{
  static double f[3][3];

  return f;
}

【讨论】:

    【解决方案2】:

    你应该总是 typedef 像这些复杂的返回类型,而不是要求读者解开它们。 (或者重新设计,这样你就没有复杂的类型了!)

    但是您可以按照模式进行。要声明这种类型的变量,你会这样做

    double (*var)[3];
    

    为了使它成为一个功能,你只需将通常的装饰放在名称旁边的通常位置,尽管它看起来很可怕。例如带有一个名为 zint 参数:

    double (*func(int z))[3]
    {
        // ...
    }
    

    顺便说一句,cdecl 会为你做这件事,一旦你学会了它的语言。

    【讨论】:

    • 谢谢。这就是我一直在寻找的。看到语法,我相信我会坚持使用 typedef :D 另外,为了完整起见,这里是一个方法的代码(这也令人困惑):double (*Class::func(void))[3]
    猜你喜欢
    • 1970-01-01
    • 2010-12-21
    • 2011-12-04
    • 1970-01-01
    • 2011-11-28
    • 2014-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多