我使用 std::variant 和 std::visit 來呼叫運算子函式。我有很多變體(它們主要從一個超類繼承),但大多數運算子函式應該回傳相同的值。有沒有辦法擁有一個運算子函式,每次呼叫這些子類中的一個時都會呼叫該函式(例如,如果使用子類作為引數呼叫普通函式,并且如果沒有這樣的函式,則(overlaoded ) 函式被呼叫,如果超類是一個引數。
舉個例子可能更容易理解:
我有兩個超類:
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
如果我為這個確切的節點(在這種情況下為 minus_node)插入運算子函式,然后為其他節點再次發生,那么這個錯誤就會消失,所以似乎沒有呼叫一般的運算子函式。
是否有任何解決方案,或者我是否必須保留每個操作員功能?
uj5u.com熱心網友回復:
只需使用模板operator():
template<class Node>
double operator()(Node* node) {
if constexpr (std::is_same_v<Node, addition_node>) {
// ...
} else if constexpr (std::is_same_v<Node, division_node>) {
// ...
}
}
uj5u.com熱心網友回復:
您的訪客應該是這樣的:
visitor(variant1);visitor(variant2);- ..
visitor(variantN);
是有效的。
所以是的,你可以分組一些。
這里
double operator(function_node* node){ return 0; }
就足夠了。
演示。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/339985.html
上一篇:如果程式運行超過特定時間限制,則終止/停止程式的命令
下一篇:將嵌套結構傳遞給函式
