【问题标题】:How to write C++ code that has an "argument out" where the type is not trivially known compile time?如何编写具有“参数输出”的 C++ 代码,其中类型不是众所周知的编译时间?
【发布时间】:2021-03-06 10:52:12
【问题描述】:

我想编写一些可用于 C++ 单元的模板化代码。例如,如果我计算一个浮点数的平方,我会得到一个浮点数,但为了使代码更通用并为单位做好准备,我认为我应该使用 auto 作为返回类型,以便将米作为输入变成米的平方作为输出,即

template<typename type_base>
auto squared(type_base const vin){
    return vin * vin;
}

我的问题是,如果我想使用“arg out”API,应该怎么做?我尝试了以下方法,但我的编译器抱怨。这是预期的吗?我应该做些什么来让我的编译器开心吗?这样做的首选方法是什么?

例子:

template<typename type_base>
void squared_2(type_base const & vin, auto & vout){
  vout = vin * vin;
}

更一般地说,有一种方法可以在编译时说自动输出(示例 1)或自动 vout(示例 2)的类型应该是 type_base * type_base 的类型,这样事情就会变得更加受限,并且我会在编译时检测函数核心中可能存在的实现问题吗?

当然,在这种情况下并没有真正需要使用 arg_out,但我真正的用户案例具有更重的类型(它们是基于基本类型的模板,可能是单位)。

【问题讨论】:

  • 你能举一个实际的例子说明你最终想如何使用它吗?
  • 现在我想在计算 3D 向量的范数时使用它。即,与这两个示例非常相似,除了 args 将是一些 Vector3&lt;type_base&gt; 并且函数将被称为 norm_squared。但我认为在问题中包含这些细节会显得过于具体。
  • 您也可以尝试抽象它,就像您对模板定义所做的那样? minimal reproducible example 将是理想的。
  • 使代码更通用并为单位做好准备”是什么意思?在这种情况下,什么是“单位”?
  • 首先你忘记了返回值void,其次输出参数更好(github.com/isocpp/CppCoreGuidelines/blob/master/…)。如果你仍然想要它,你需要第二个模板参数(类型名 TResult,然后是 TResult& vout)。

标签: c++ types auto


【解决方案1】:

您可以使用 decltype 来确定产品的结果,如下所示:

#include <iostream>

template<typename type_base>
void squared_2(type_base const & vin, decltype(vin*vin) & vout){
    vout = vin * vin;
}


int main()
{
    double a;
    squared_2(5.,a);
    std::cout<<a<<std::endl;
}

【讨论】:

  • 啊,谢谢,我不知道这一点。将更详细地查看 decltype :) .
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-13
  • 2019-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多