我正在使用 std::variant 和 std::visit 来调用运算符函数。我有很多变体(主要从一个超类继承),但大多数运算符函数应该返回相同的值。有没有办法拥有一个运算符函数,每次调用其中一个子类时都会调用该函数(例如,如果使用子类作为参数调用普通函数并且如果没有这样的函数,则(重载) 函数被调用,如果超类是一个参数。
举个例子可能更容易理解:
我有两个超类:
struct function_node; struct nary_node;
我还有多个继承自这些超类的类:
struct addition_node : function_node, nary_node;
struct division_node: function_node, nary_node;
struct cos_node: function_node, nary_node;
我有另一个类,其中有这些类作为变体:
struct value_node{
var get_variant(){
return std::variant<
addition_node*,
division_node*,
cos_node*
>;
}
};
我终于有了最后一个类(constant_checker),它评估表达式。
double eval(value_node* node){
return std::visit(*this, node->get_variant());
}
在这最后一堂课中,我目前有多种形式的运算符函数:
double operator(division_node* node){
return 0;
}
这很好用,但我实际上有很多这样的子节点。由于操作符函数都应该返回相同的值,我想要一个操作符函数,例如
double operator(function_node* node){
return 0;
}
我已经以这种确切的方式尝试过,但我收到错误
3>C:\...\include\variant(1644): error C2893: Failed to specialize function template 'unknown-type std::_C_invoke(_Callable &&,_Types &&...) noexcept(<expr>)'
3>C:\...\include\variant(1644): note: With the following template arguments:
3>C:\...\include\variant(1644): note: '_Callable=ale::util::constant_checker &'
3>C:\...\include\variant(1644): note: '_Types={ale::minus_node *}'
3>C:\...\include\variant(1656): error C2955: 'std::_All_same': use of class template requires template argument list
如果我为这个确切的节点(在这种情况下为减节点)插入运算符函数,然后为其他节点再次发生此错误,则此错误将消失,因此显然不会调用通用运算符函数。
有什么解决方案吗,还是我必须保留每个操作员功能?