我想在C++中擁有dynamic_call功能。它應該觸發重載解析並根據參數的動態類型調用目標類(Visitor)上最具體的函數。它應該替換訪問者模式,並應像C#中的動態關鍵字一樣工作。 我粘貼了我到目前爲止的下面。我想不必在調用方聲明通用lambda,而是在動態調用的實現上使它更易於使用。這可能嗎?C++中的動態分派 - 更好的語法
#include <iostream>
struct Base { virtual ~Base() = default; };
class A : public Base {};
class B : public Base {};
template <class... Ts>
class dynamic_call {
public:
template <class F, class Arg>
static void call(F& func, Arg& a) {
call_impl<F, Arg, Ts...>(func, a);
}
private:
template <class F, class Arg>
static void call_impl(F& /*func*/, Arg& /*a*/) {
//end of recursion => nothing more to be done
}
template <class F, class Arg, class T, class... R>
static void call_impl(F& func, Arg& a) {
T* t = dynamic_cast<T*>(&a);
if(t) {
func(*t);
}
call_impl<F, Arg, R...>(func, a);
}
};
using namespace std;
struct Visitor {
void Visit(A&) { cout << "visited for a" << endl; }
void Visit(B&) { cout << "visited for b" << endl; }
};
int main(int /*argc*/, char */*argv*/[])
{
Visitor v;
auto func = [&v](auto& a) { v.Visit(a); };
A a;
dynamic_call<A, B>::call(func, a);
B b;
dynamic_call<A, B>::call(func, b);
{
Base& base(a);
dynamic_call<A, B>::call(func, base);
}
{
Base& base(b);
dynamic_call<A, B>::call(func, base);
}
return 0;
}
我想這樣調用它,而不需要添加通用lambda。
dynamic_call<A,B>::call(v, a);
使用'std :: function'可能是。您的問題不清楚 –
我是否正確理解您基本上希望'Visit'(或對其進行封裝調用)表現得像是'Base'的虛擬成員函數?關於你的最後一項要求:在'Visitor'中將'Visit'改爲'operator()',你的行就可以工作。 – user4407569
@eichhörnchennope我想調用正確的實現訪問取決於參數的運行時類型。這不是一個正常的虛擬電話。 –