gpt4 book ai didi

C++11 如何代理只有名称和父类的类函数?

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

我想知道是否可以使用 boost::mpl/preprocessor 或一些 noce C++11 功能从类类型和函数名称创建函数代理。

假设我们有:

  inline void set_email(const ::std::string& value);
inline void set_email(const char* value);

内部类电子邮件。我们知道其中有 set_email 函数,我们想创建一个具有类似 API 的代理类

PROXY(Email, set_email, MyEmail)

Email * email = new Email();
MyEmail * myEmail = new MyEmail(email);

并能够调用任何 set_email 重载。是否有可能以及如何创建这样的类来代理任意数量的重载函数,而不知道类型(仅名称)?

最佳答案

这个怎么样:

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) \
{ \
} \
\
/* 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 上编译和工作正常:

#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 如何代理只有名称和父类的类函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13800449/

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