gpt4 book ai didi

C++ 委托(delegate)练习

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:42:10 25 4
gpt4 key购买 nike

我一直在做一个小的委托(delegate)模板练习,以 1.) 提高自己,2.) 更好地理解模板元编程,以及 3.) 甚至可能将委托(delegate)用于一些事件驱动的编程(因为我不可以访问标准库)。根据this答案,可以为功能实现类似以下内容:

template <typename T, typename R, typename ...Args>
R proxycall(T & obj, R (T::*mf)(Args...), Args &&... args)
{
return (obj.*mf)(args...);
}

proxycall(myobj, &MyObj::func);

似乎编译器只需将 myobj&MyObj::func 传递到模板中就可以计算出返回类型、类类型和参数类型。是否可以使用与上述相同的方法来创建委托(delegate)类(存储对对象的引用和指向成员函数的指针的类)?

Delegate d(myobj, &MyObj::func); /* Preferred */

Delegate<myobj, &MyObj::func> d; /* Ok */

下面的类是我的委托(delegate)类,它有一个不幸的副作用,即必须在相应的成员函数中指定 ReturnTypeParameters 的类型。正如我在上面看到的,编译器可以解决这些问题。那么,我怎样才能让编译器帮助我呢?

template <class Class, typename ReturnType, typename ... Parameters>
class Delegate {
public:
typedef ReturnType (Class::*Method)(Parameters ... params);

Delegate(Class& ref, Method m) : obj(ref), method(m) {}
ReturnType operator()(Parameters ... params) { return (obj.*method)(params...); }
ReturnType Invoke(Parameters ... params) { return operator()(params...); }
private:
Class& obj;
Method method;
};

/* Usage */
Delegate<MyObj, void> d(myobj, &MyObj::func);
^^^^^^^^^^^
ick

最佳答案

Delegate d(myobj, &MyObj::func);

基本上这将使 Delegate 独立于成员函数及其类的类型。只有构造函数模板会知道返回类型和参数类型。类没有。您将需要类型删除以使委托(delegate)的类型独立于内部函数对象的类型——基本上您将实现一个 std::function。解释了其实现 here (请注意,function 在返回或参数类型方面不是固定的)。

如果您只想要更好的语法和更少的代码冗余,请使用工厂模板:

template <typename T, typename R, typename ...Args>
Delegate<T, R, Args...> make_delegate(T& obj, R (T::*mf)(Args...))
{
return {obj, mf};
}

当使用适当的参数调用时,返回一个正确初始化了相应类型的委托(delegate)。

auto deleg = make_delegate(myobj, &MyObj::func);

关于C++ 委托(delegate)练习,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26764157/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com