6
存儲和返回泛型類型(甚至無效)我正在實現一個RPC系統,旨在執行遠程過程中的任務。 RPC系統的一個節點是Monitor,它應記錄每個呼叫。從函數
template<typename Transport, typename Journal>
class Monitor
{
public:
Monitor(Transport transport, Journal &journal) :
transport{std::move(transport)},
journal{journal}
{
}
public:
template<typename Method>
typename Method::Result operator()(const Method &method)
{
Method::Result result;
journal("->", Method::Name());
result = transport(method);
journal("<-", Method::Name());
return result;
}
private:
Transport transport;
Journal &journal;
};
它工作正常,除了一個情況下,當Method :: Result是無效的。要解決此我不得不運營商()分割成兩個部分
template<typename Transport, typename Journal>
template<typename Method>
std::enable_if_t<std::is_same<typename Method::Result, void>::value, typename Method::Result> operator()(const Method &method)
{
journal("->", Method::Name());
transport(method);
journal("<-", Method::Name());
}
template<typename Transport, typename Journal>
template<typename Method>
std::enable_if_t<!std::is_same<typename Method::Result, void>::value, typename Method::Result> operator()(const Method &method)
{
Method::Result result;
journal("->", Method::Name());
result = transport(method);
journal("<-", Method::Name());
return result;
}
有什麼辦法消除複製粘貼,假設行journal("<-", Method::Name());
不應例外(的情況下執行的,所以我不能在構造/析構函數中包裝日誌記錄)?
謝謝你的建議。從來沒有聽說過std :: uncaught_exception。唯一的缺點是檢查是在運行時執行的,我必須爲它付出性能損失 – sliser