2016-04-11 144 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