繁体   English   中英

重载成员函数指针的演员转换助手

[英]cast helper for overloaded member function pointer

我想对方法的指针进行“更精细”的转换操作。

给定的是一个带有重载成员函数的类,以及一个模板,它可以使用每种成员指针和对象并简单地调用它们。

class A
{
    public:
        void Do( int i ) { std::cout << "Hallo with int " << i << std::endl;}
        void Do( float f ) { std::cout << "and with float " << f << std::endl;}
        void Do( std::string s ) { std::cout << "also with string " << s << std::endl;}
};

    template <typename OBJECT, typename METHOD, typename ... PARMS>
void Call( OBJECT& obj, METHOD m, PARMS ... parms)
{
    std::cout << __PRETTY_FUNCTION__ << std::endl;

    (obj.*m)(parms...);
}

现在,如果要使用Call模板,则必须手动强制转换指针以获取正确版本的重载函数,例如:

   Call( a, static_cast< void(A::*)(int)>( &A::Do ), 1);
   Call( a, static_cast< void(A::*)(float)>( &A::Do ), 8.88);
   Call( a, static_cast< void(A::*)(std::string)>( &A::Do ), "Willi");

因此,我想使演员表更易于阅读,并获得以下帮助器类:

template <typename > class Cast;

template < typename RET, typename ... ARGS >
class Cast< RET(ARGS...)>
{
    public:
        template < typename OBJ >
            static auto From( RET(OBJ::*ptr)(ARGS...))-> RET(OBJ::*)(ARGS...)
            {
                return ptr;
            }
};

并可以将其用作:

    Call( a, Cast<void(int)>::From( &A::Do ), 100);
    Call( a, Cast<void(float)>::From( &A::Do ), 4.46);
    Call( a, Cast<void(std::string)>::From( &A::Do ),"Check it");

问:是否可以使我的类Cast一个模板函数来使Cast调用的语法更容易一些? 我想要可以这样称呼的东西:

Call( a, Cast<void(std::string)>(  &A::Do ), "Yeeeaaa!");

但是我找不到以这种方式编写模板函数的方法,因为不允许我编写的任何类型的专业化知识。

允许使用任何类型的c ++。 如果C ++ 17提供了新的方法,请告诉我!

为什么我不能在call函数中使用lambda的参数:

我的真实代码只需要注册指针,而无需直接调用指针。 因此,强制转换功能还必须使用:

Register( a, Cast<void(int)>::From( &A::Do ));

您不必分开参数和结果类型即可再次加入它们。 只需声明一个指向函数类型的成员指针即可:

template <typename F, typename C>
auto Cast(F (C::*ptr)) {
    return ptr;    
}

您所需的语法有效:

Call(a, Cast<void(std::string)>(&A::Do), "Yeeeaaa!");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM