通用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)...);
}
};
演示
要包装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};
}
};
演示
还应该处理const
和非默认构造函数。(并找到更好的名字)。
相关文章:
- 我的包装函数缺少变量?
- 为什么这个"ctypes"包装函数的返回值是"c_long(0)"而不是&quo
- 如何将包装类的对象用作包装函数中的参数
- 包装C++函数以使用 SWIG 获取 Lua 字符串表
- 带有默认参数的宏包装函数调用
- 如何使用模板函数参数编写包装函数,该功能可以采用超载的成员函数
- 创建一个__cdecl以在 C++ 上__thiscall包装函数
- 在C++中实现和包装函数组合以进行惰性计算
- c++11:如何编写一个包装函数来生成"std::function"对象
- 为什么 Dart 中的原生包装函数与非常轻量级的函数相比"DEFINE NATIVE ENTRY"如此重量级?
- 在 C++ 中使用 map,并提供包装函数以在 C 语言中使用它
- 包装函数只有在链接为静态时才从链接库调用
- 尝试包装函数返回值时出现"<类名>不提供调用运算符"错误
- 交叉编译器/平台裸包装函数,无条件跳转到函数指针
- realloc C 函数的可能包装函数有什么错误?
- 包装 C++ 函数以在 C# 中使用
- 采用"pass by reference"值的递归函数的包装函数
- C++包装函数(宏)来访问 COM 对象属性
- 包装函数指针和函数对象在泛型代码中是如何工作的
- 在c++类中直接包装函数