C ++委托练习

时间:2014-11-05 18:11:34

标签: c++ templates template-meta-programming

我一直在努力做一个小的委托模板练习1.)更好的自己,2。)更好地理解模板元编程,以及3.)甚至可能使用委托进行一些事件驱动的编程(因为我不可以访问标准库)。根据{{​​3}}回答,可以为函数实现以下内容:

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 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

1 个答案:

答案 0 :(得分:2)

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

基本上这会使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);
相关问题