Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用模板C和x2B进行型式试验+;_C++_Templates - Fatal编程技术网

C++ 使用模板C和x2B进行型式试验+;

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

所以我有一个函数,它接受两种可能的参数类型,每种类型都是我预定义的lambda函数类型。这两种可能性是CellFType和FType。这两种情况下的函数几乎相同,但在一行中,我需要它根据函数类型执行两种不同的操作。我想避免为此带来额外的负担,所以我将其模板化

/// 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函数,并提供该函数的两个重载。