C++ 使用模板C和x2B进行型式试验+;
所以我有一个函数,它接受两种可能的参数类型,每种类型都是我预定义的lambda函数类型。这两种可能性是CellFType和FType。这两种情况下的函数几乎相同,但在一行中,我需要它根据函数类型执行两种不同的操作。我想避免为此带来额外的负担,所以我将其模板化C++ 使用模板C和x2B进行型式试验+;,c++,templates,C++,Templates,所以我有一个函数,它接受两种可能的参数类型,每种类型都是我预定义的lambda函数类型。这两种可能性是CellFType和FType。这两种情况下的函数几乎相同,但在一行中,我需要它根据函数类型执行两种不同的操作。我想避免为此带来额外的负担,所以我将其模板化 /// Returns the integral 2 norm of a function template <typename FunctionType> double norm(const FunctionType &am
/// Returns the integral 2 norm of a function
template <typename FunctionType>
double norm(const FunctionType &f)
{
double value = 0.0;
for (size_t iT = 0; iT < n_cells; iT++)
{
QuadratureRule quadT = cell_quads[iT];
for (size_t iqn = 0; iqn < quadT.size(); iqn++)
{
double qr_weight = quadT[iqn].w;
VectorRd f_on_qr = (typeid(FunctionType) == typeid(FType<VectorRd>) ?
f(quadT[iqn].vector()) : f(quadT[iqn].vector(), cells[iT])); // *ERROR*
value += qr_weight * scalar_product(f_on_qr, f_on_qr);
}
}
return sqrt(value);
}
///返回函数的整数2范数
模板
双范数(常数函数类型和f)
{
双值=0.0;
对于(大小iT=0;iT
FType和CellFType也都是这样模板化的:
template <typename T>
using CellFType = std::function<T(const VectorRd &, const Cell *)>;
template <typename T>
using FType = std::function<T(const VectorRd &)>;
模板
使用CellFType=std::function;
模板
使用FType=std::function;
为什么这会引起问题?如何在这里正确地进行类型测试?注释中的解决方案,调用重载函数,当然是最容易理解的,因此也是最好的方法 但是,有时候把所有内容都内联起来是很好的。因为您使用的是C++17,所以有一个helper类经常与
std::visit一起使用:
模板结构重载:Ts。。。{使用Ts::运算符()…;};
模板重载(Ts…)->重载;
它接受一组lambda,并将它们转换为一个具有调用运算符重载的类来调用每个lambda。您也可以使用此功能发送您的案例:
vectord f_on_qr=过载{
[&](FType g){return g(quadT[iqn].vector());},
[&](CellFType g){返回g(quadT[iqn].vector(),cells[iT]);}
}(f);
概念证明:
您是如何获得lambda的类型的?我将提供一些更详细的代码in@StephenNewell这是有帮助的,还是会让事情变得更复杂?我问,因为如果您使用的是实际的lambda,我不确定如何在编译时获得类型。实际上,您添加的代码没有获得lambda的类型,因为lambda与std::function不同。在运行时,只计算条件运算符的一个分支并不重要。在编译时,在模板实例化期间,两个分支都必须格式良好。有了足够现代化的编译器,您可以使用if constexpr
。或者,将一个有问题的行分解成一个单独的helper函数,并提供该函数的两个重载。