c++存储任意类型的函数对象和类-创新互联
目录
创新互联公司公司2013年成立,是专业互联网技术服务公司,拥有项目网站建设、成都网站设计网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元福海做网站,已为上家服务,为福海各地企业和个人服务,联系电话:028-86922220任意函数对象
备忘
任意类
备忘
总结
任意函数对象
#include#include#include#include#include
using namespace std;
templateconcept VoidType = is_void::value;
templateconcept NoneVoidType = !is_void::value;
class BaseService
{
public:
virtual ~BaseService() {}
string info;
};
//question: NoneVoidType and VoidType can not used at the mean time
templateclass Service : public BaseService
{
using FuncType = function;
public:
Service(FuncType func)
:func_(func)
{
}
RetType Run(ArgTypes&&... args)
{
return func_(forward(args)...);
}
private:
FuncType func_;
};
//可变参数无法偏特化
//template//class Service: public BaseService
//{
// using FuncType = function;
//public:
// Service(FuncType func)
// :func_(func)
// {
//
// }
// void Run(ArgTypes... args)
// {
// func_(args...);
// }
//private:
// FuncType func_;
//};
class ServiceManager
{
using BaseServicePtr = shared_ptr;
public:
templatevoid RegisterService(const string& name, const ServiceType& service)
{
service_map_.insert(pair(name, BaseServicePtr(new ServiceType(service))));
};
templateRetType Excute(const string& name, ArgTypes&&... args)//
{
if (service_map_.count(name))
{
auto service_ptr = service_map_[name];
Service* true_service_ptr = dynamic_cast*>(service_ptr.get());
return true_service_ptr->Run(forward(args)...);
}
else
{
return RetType();
}
}
private:
unordered_mapservice_map_;
};
struct StatusCode
{
int code = 0;
};
ostream& operator<<(ostream& os, const StatusCode code)
{
os<< "status code: "<< code.code<< endl;
return os;
}
int main()
{
ServiceManager manager;
auto add = [](int a, double b, double& c)->double
{
c = a + b;
return a + b;
};
auto add1 = [](int a, double b, double& c)->StatusCode
{
c = a + b;
return StatusCode{ 0 };
};
Serviceadd_service(add);
Serviceadd1_service(add1);
manager.RegisterService>("add", add_service);
manager.RegisterService>("add1", add1_service);
double test = 0;
cout<("add", 2, 1.08,test)<("add1", 2, 2.08, test);
cout<< test<< endl;
//any a = 2;
//any b = 1.08;
//any c = 0.f;
//any d = a + b;
//cout<< manager.Excute("add", a, b, c)<< endl;
//cout<< any_cast(c)<< endl;
return 0;
}
备忘&& 加 forward完美转发;
有返回值和无返回值函数没办法用一个类实现,通过额外信息记录。
任意类class A {
public:
static A* Create() { return new A(); }
};
Instance::Register("A", A::Create);
auto a = Instance::Create("A");
备忘c++ 无法存储类型,只能存储产生该类型对象的函数;
总结c++ 没有反射系统,在rpc等场景中需要构建用户级反射系统,以便于存储类型或者函数。
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
标题名称:c++存储任意类型的函数对象和类-创新互联
分享地址:http://ybzwz.com/article/hdjhe.html