C ++ 11如何代理类功能仅具有它的名字和父类? [英] C++11 how to proxy class function having only its name and parent class?
问题描述
我不知道是否有可能使用boost :: MPL / preprocessor或某些诺斯C ++ 11的功能,从类类型和函数的名称创建功能的代理。
I wonder if it is possible using boost::mpl/preprocessor or some noce C++11 features to create function proxy from class type and function name.
假设我们有:
inline void set_email(const ::std::string& value);
inline void set_email(const char* value);
类里面的电子邮件。我们知道有set_email函数n它,我们想创建一个API类PROX像
inside class Email. We know there is set_email function n it, we want to create a prox class with API like
PROXY(Email, set_email, MyEmail)
Email * email = new Email();
MyEmail * myEmail = new MyEmail(email);
和有abilety调用任何set_email的overloads.Is可能以及如何创建这样的类,它会代理任意数量的过载功能,不知道有类型(仅名称)?
and have abilety to call any of set_email overloads.Is it possible and how to create such class that would proxy any number of overload functions not knowing there types (only names)?
推荐答案
这个怎么样:
#include <type_traits>
#include <utility>
#define PROXY(proxified, member_function, proxy_name) \
class proxy_name \
{ \
private: \
proxified & ref_; \
\
public: \
proxy_name(proxified &ref) \
: ref_(ref) \
{ \
} \
\
/* general version */ \
template<typename ... Args> \
auto member_function(Args&& ... args) \
-> typename std::enable_if<!std::is_void<decltype(ref_.member_function(std::forward<Args>(args)...))>::value, \
decltype(ref_.member_function(std::forward<Args>(args)...))>::type \
{ \
return (ref_.member_function(std::forward<Args>(args)...)); \
} \
\
/* void return type version */ \
template<typename ... Args> \
auto member_function(Args&& ... args) \
-> typename std::enable_if<std::is_void<decltype(ref_.member_function(std::forward<Args>(args)...))>::value, \
void>::type \
{ \
ref_.member_function(std::forward<Args>(args)...); \
} \
\
};
这编译和工作正常,我在 G ++ 4.7
:
This compiles and work fine for me on g++ 4.7
:
#include "proxy_macro.hpp"
#include <iostream>
#include <string>
class Email
{
public:
void set_email(const ::std::string& value)
{
std::cout << value << std::endl;
}
void set_email(const char* value)
{
std::cout << value << std::endl;
}
int set_email()
{
return (42);
}
};
PROXY(Email, set_email, MyEmail)
int main(void)
{
Email mail;
MyEmail my_mail(mail);
std::string str = "test string";
const char * ptr = "test char pointer";
my_mail.set_email(str);
my_mail.set_email(ptr);
std::cout << "test return: " << my_mail.set_email() << std::endl;
return (0);
}
编辑(较小的版本感谢评论)
proxy_macro.hpp
#include <type_traits>
#include <utility>
#define PROXY(proxified, member_function, proxy_name) \
class proxy_name \
{ \
private: \
proxified & ref_; \
\
public: \
proxy_name(proxified &ref) \
: ref_(ref) \
{ \
} \
\
template<typename ... Args> \
auto member_function(Args&& ... args) \
-> decltype(ref_.member_function(std::forward<Args>(args)...)) \
{ \
return (ref_.member_function(std::forward<Args>(args)...)); \
} \
};
这篇关于C ++ 11如何代理类功能仅具有它的名字和父类?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!