【发布时间】: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<type_base>并且函数将被称为norm_squared。但我认为在问题中包含这些细节会显得过于具体。 -
您也可以尝试抽象它,就像您对模板定义所做的那样? minimal reproducible example 将是理想的。
-
“使代码更通用并为单位做好准备”是什么意思?在这种情况下,什么是“单位”?
-
首先你忘记了返回值
void,其次输出参数更好(github.com/isocpp/CppCoreGuidelines/blob/master/…)。如果你仍然想要它,你需要第二个模板参数(类型名 TResult,然后是 TResult& vout)。