通用 C++ 函数包装

Generic C++ function wrapping

我打算编写一个简单的通用智能指针模板,它允许程序员在调用某些函数 FUNC() 之前和之后应用任意数量的换行 例如如果要求是启动计时器,锁定,log_start,FUNC(),log_end,解锁,停止计时器

然后我希望能够编写一些简单的东西,程序员向模板提供 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++ 成员函数调用”中描述的方法轻松地使其工作,但想知道是否有更通用和更优雅的解决方案。

简单的方法是只包装所有 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 和非默认构造函数也应该完成。 (并找到更好的名字)。