2016-04-11 141 views
0

我打算寫一個簡單的通用智能指針模板,它允許程序員在調用函數FUNC() (例如)之前和之後應用任意數量的包裝。如果需要啓動定時器,鎖定,log_start,FUNC(),log_end,解鎖,停止定時器通用C++函數包裝

然後,我想能夠寫一些簡單的地方,程序員提供3種類型和一個功能的模板和讓編譯器完成剩下的工作。 我感覺它可以在類似類型串是如何工作的結合超載運營的方式,使用可變參數模板來完成 - >

class timer {}; // ctor start timer, dtor stop timer 
class locker{}; // ctor lock, dtor unlock 
class logger{}; // ctor lock, dtor unlock 

然後一些代碼,如

template <typename ...base_class_list> 
class aggregate : public base_class_list... {}; 
using pre_conditions = aggregate<logger, locker, trans>; 

class gadget 
{ 
    auto do_something() -> void; 
}; // gadget 

最後(我想寫的部分,但不知道如何將它粘在一起

SMART_PTR<pre_conditions, gadget> g; 
g->do_something(); 

我可以很容易地使用Bjarne Stroustrup在「包裝C++成員函數調用」中描述的方法工作,但想知道是否有更通用和更優雅的解決方案。

+0

請說明您的具體問題或添加其他詳細信息,以確切地突出顯示您的需求。正如目前所寫,很難確切地說出你在問什麼。請參閱[如何提問](http://stackoverflow.com/help/how-to-ask)頁面以獲得澄清此問題的幫助。 – Barry

+1

這個問題引用了Mixins的一個非常好的例子,我相信它和你正在嘗試做的事情有關:http://stackoverflow.com/questions/34193264/mixin-and-interface-implementation/34193545#34193545 –

+0

我想你'進入[面向方面的編程](https://en.wikipedia.org/wiki/Aspect-oriented_programming#cite_note-22),爲此在2000年及以後開發了幾個框架和工具集。例如。查找[AspectC++](https://en.wikipedia.org/wiki/AspectC%2B%2B)(我沒有使用它,我剛剛通過Google搜索發現它)。據我所知,這個想法源於ParkPlace。 –

回答

0

最簡單的辦法是隻包所有operator()

template <typename T, typename ... Ts> 
struct magic 
{ 
    T obj; 

    template <typename ... Us> 
    decltype(auto) operator()(Us...args) 
    { 
     ordered_tuple<Ts...> t; // tuple doesn't guaranty order 
     obj(std::forward<Us>(args)...); 
    } 
}; 

Demo

爲了總結operator ->,更棘手:

template <typename T, typename ... Ts> 
class wrapper 
{ 
    ordered_tuple<Ts...> t; // tuple doesn't guaranty order 
    T* obj; 
public: 
    wrapper(T* obj) : obj(obj) {} 

    T* operator ->() 
    { 
     return obj; 
    } 
}; 

template <typename T, typename ... Ts> 
class magic 
{ 
    T obj; 
public: 
    wrapper<T, Ts...> operator ->() 
    { 
     return {&obj}; 
    } 
}; 

Demo

處理const和非默認構造函數也應該完成。 (並找到更好的名字)。

+0

完美,這正是我一直在尋找的。 – PMcK

+0

現在寫在博客上https://patmckblog.wordpress.com/2016/04/14/a-hidden-gem-overloading-operator/ – PMcK

+0

@PMcK:我會添加有關'std: :tuple'和你的類'聚合'(這可能不是一個聚合順便說一句)(這就是爲什麼我把它稱爲'ordered_tuple')。 – Jarod42