使用隐式 this 调用模板中的成员函数指针

发布于 2025-01-12 07:52:12 字数 1288 浏览 0 评论 0原文

看看 这个答案,我可以看到如何通过显式传入 this 来调用指向成员函数的指针代码>.但是,如果我希望传入的函数成为当前对象的成员并使用隐式 this 该怎么办?

我已经写了这个,似乎可以工作,但它是有效的代码吗?是否有更好的方法(C++14 或更低版本)避免 dynamic_cast来源onlinegdb.com

#include <iostream>

class Base
{
    public:
        // From https://stackoverflow.com/a/9779391/1270789
        template<typename T, typename R>
        R proxycall(T *obj, R (T::*mf)(int))
        {
            return (obj->*mf)(42);
        }

        // My attempt
        template<typename T, typename R>
        R proxycall(R (T::*mf)(int))
        {
            return ((dynamic_cast<T *>(this))->*mf)(42);
        }
        
        virtual ~Base() {}
};

class Foo: public Base
{
    public:
        int doFoo(int x) { std::cout << "doing foo\n"; return x / 2; }
        int doCall() { return proxycall(this, &Foo::doFoo); } // OK
        int doNoThisCall() { return proxycall(&Foo::doFoo); } // Is this OK?
};

int main()
{
    Foo foo;
    std::cout << foo.doCall() << '\n';
    std::cout << foo.doNoThisCall() << '\n';

    return 0;
}

Looking at this answer I can see how to call a pointer to a member function by explicitly passing in this. However, what if I want the function passed in to be a member of the current object and to use the implicit this.

I've written this, which seems to work, but is it valid code, and is there a better way (C++14 or below) avoiding the dynamic_cast<>? Source on onlinegdb.com

#include <iostream>

class Base
{
    public:
        // From https://stackoverflow.com/a/9779391/1270789
        template<typename T, typename R>
        R proxycall(T *obj, R (T::*mf)(int))
        {
            return (obj->*mf)(42);
        }

        // My attempt
        template<typename T, typename R>
        R proxycall(R (T::*mf)(int))
        {
            return ((dynamic_cast<T *>(this))->*mf)(42);
        }
        
        virtual ~Base() {}
};

class Foo: public Base
{
    public:
        int doFoo(int x) { std::cout << "doing foo\n"; return x / 2; }
        int doCall() { return proxycall(this, &Foo::doFoo); } // OK
        int doNoThisCall() { return proxycall(&Foo::doFoo); } // Is this OK?
};

int main()
{
    Foo foo;
    std::cout << foo.doCall() << '\n';
    std::cout << foo.doNoThisCall() << '\n';

    return 0;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文