C++ 使用基于CRTP的类作为函数的参数,而不知道模板参数

C++ 使用基于CRTP的类作为函数的参数,而不知道模板参数,c++,templates,polymorphism,crtp,C++,Templates,Polymorphism,Crtp,我目前正在尝试编写一个微分方程解算器,并希望使用类作为运算符,它定义了一个重载运算符(),以便可以将运算符用作函子。目标是我有一些数据,为了表示温度的参数,我们取T,我想提供一个像ddt(T)=拉普拉斯(T)这样的接口,其中ddt是关于时间的一阶偏导数,拉普拉斯是关于空间的二阶偏导数。在这个例子中,我只是求解一个热方程 因为我想考虑不同的时间和空间方案,我想有两个时间和空间的基类,然后从这些基类中导出近似时间或空间的数值方案,其中我的运算符()被定义为纯虚函数 我希望能够从其操作符()返回空格操

我目前正在尝试编写一个微分方程解算器,并希望使用类作为运算符,它定义了一个重载运算符(),以便可以将运算符用作函子。目标是我有一些数据,为了表示温度的参数,我们取T,我想提供一个像ddt(T)=拉普拉斯(T)这样的接口,其中ddt是关于时间的一阶偏导数,拉普拉斯是关于空间的二阶偏导数。在这个例子中,我只是求解一个热方程

因为我想考虑不同的时间和空间方案,我想有两个时间和空间的基类,然后从这些基类中导出近似时间或空间的数值方案,其中我的运算符()被定义为纯虚函数

我希望能够从其操作符()返回空格操作符的引用,因此我使用CRTP在基类中指定返回类型

时间操作符位于等式的左侧,应该处理右侧的所有信息。因此,time类中定义的运算符==,从右侧接收运算符问题出在这里:运算符==的参数要求我指定要传递的右侧运算符的类型,但是,我不知道模板参数应该使用哪种类型,因为我希望以后接受不同类型的运算符。鉴于下面的代码,有没有一种干净的方法来解决这个问题

#包括
#包括
使用Vector=std::Vector;
模板
结构空间运算符数据库{
虚拟类型运算符()(向量和数据)=0;
受保护的:
矢量数据;
};
结构Laplacian运算符:公共空间运算符数据库{
Laplacian运算符()(向量和数据)最终覆盖{

std::cout我终于找到了一种适合我的方法。因为我使用的是c++17,所以我可以使用std::variant和std::visit作为虚拟方法的参数类型。以下是满足我需要的完整代码。在这里发布给搜索类似问题的任何人

#包括
#包括
#包括
使用Vector=std::Vector;
模板
结构空间运算符数据库{
虚拟类型运算符()(向量和数据)=0;
虚空printMyType()常量=0;
受保护的:
矢量数据;
};
结构Laplacian运算符:公共空间运算符数据库{
Laplacian运算符()(向量和数据)最终覆盖{

std::cout从数学上讲
ddt(T)
laplacian(T)
纯粹是T的函数。因此,我想挑战您的第一句话,即“希望使用类作为运算符”。您将这些操作作为对象实例而不仅仅是函数来实现的理由是什么?为什么您的
spaceOperatorBase
需要拥有一个向量,而不是将其作为另一个参数?您可以将函数签名定义为一种类型,因此
ddt(T)的所有各种实现
拉普拉斯(T)
仍然可以“继承”一个公共函数签名。好吧,这是一个适合这个网站的玩具示例,很明显,看看这个简单的示例,你可能有点道理。但是,对于我的实际问题,我确实有理由希望在数据上直接使用它们不拥有的函子(因此,我不会得到同一个操作符的多个实例,其中只有它所操作的数据发生了变化),我有一个很好的理由希望将对象传递给时间操作符,它需要来自空间操作符的多个信息,因此只传递整个对象更简单。但是,在不知道类型的情况下,我不知道如何传递
preparing time-integration
solving laplacian operator
solving equation
I am a laplacian operator