c – 如何使std :: data的数据类型映射到函数指针
我有这样的数据结构
enum DataType_t{INT,FLOAT}; struct Data { DataType_T type; void* min; void* max; }; 变量min和max取决于type的值.我想知道是否有办法创建一个像std :: map std::map<DataType_t,SomeFcnPtr> myMap; myMap[INT] = ?? // Here should be a pointer to a function like int(*FcnPtr)(Data d,bool min); myMap[FLOAT] = ?? // Here should be a pointer to a function like float(*FcnPtr)(Data d,bool min); 有没有办法创建这样一个具有不同返回数据类型的函数指针的映射? 最后我想用它来规范化值 float normalizedValue = (readValue - mayMap[INT](intData,true)) / (mayMap[INT](intData,false) - mayMap[INT](intData,true)) 我看了this post看起来非常相似,但不理解提出的想法,也许你可以举个例子. 编辑 我将对我正在尝试的内容添加更多解释. struct Data具有字段DataType_t类型.根据类型I的值,需要正确地转换min和max字段以使其正确表示为int或float.一种可能的方式是 int getMinOrMaxForINT(Data aData,bool min) { if(min) return *((int*)aData.min)); return *((int*)aData.max)); } 和类似的 float getMinOrMaxForFLOAT(Data aData,bool min) { if(min) return *((float*)aData.min)); return *((float*)aData.max)); } 最后在一些函数处理我可以做的数据变量 void someFunction(int value,Data aData) { float normalizedValue = 0; if(aData.type == DataType_t::INT) { normalizedValue = (value - getMinOrMaxForINT(aData,true)) / (getMinOrMaxForINT(aData,false) - getMinOrMaxForINT(aData,true)); } else if(aData.type == DataType_t::FLOAT) { normalizedValue = (value - getMinOrMaxForFLOAT(aData,true)) / (getMinOrMaxForFLOAT(aData,false) - getMinOrMaxForFLOAT(aData,true)); } } 正如您注意到getMinOrMaxForXXXX的代码完全相同,但返回和强制转换类型除外.我想过使用像这样的模板 template <typename T> T getMinOrMax(Data aData,bool min) { if(min) return *((T*)aData.min)); return *((T*)aData.max)); } 但问题是如何使地图获得指向某个特化的指针,例如 myMap[DataType_t::INT] = //PointerTo getMinOrMax<int> myMap[DataType_t::FLOAT] = //PointerTo getMinOrMax<float> 这可以帮助我简化过程函数中的函数代码 void someFunction(int value,Data aData) { float normalizedValue = (value - myMap[aData.type](aData,true)) / (myMap[aData.type](aData,false) - myMap[aData.type](aData,true)); } 解决方法
使用std :: tuple<的std ::对< DataType,std :: function< void()> > > MYMAP;
然后在这里使用这种技术实现get by type,参见示例和工厂: 按类型查看: 从这里开始: int retInt(){ return 1; } float retFloat(){ return 1.f; } char retChar(){ return 'a'; } int main(int,char *[]) { std::tuple< std::pair< int,std::function< int () > >,std::pair< float,std::function< float() > >,std::pair< char,std::function< char () > > > map; std::get<0>(map).second = retInt; int result = std::get<0>(map).second(); return 0; } 当我从元组中获取第一个元素并执行该函数时,这是一个简单的例子.现在,我们需要通过使用类型来找到元素,而不是获取第一个元素.一点元编程: namespace detail{ template <class T,std::size_t N,class... Args> struct get { static const auto value = N; }; template <class T,class... Args> struct get<T,N,T,Args...> { static const auto value = N; }; template <class T,class U,U,Args...> { static const auto value = get<T,N + 1,Args...>::value; }; } template <class T,class... Args> std::pair< T,std::function< T() > >& get(std::tuple<Args...>& t) { using Entry = std::pair<T,std::function<T()> >; return std::get<detail::get<Entry,Args...>::value>(t); } 然后打电话给它看起来像: int main(int,std::function< char () > > > map; get< int >(map).second = retInt; int result = get<int>(map).second(); get< float >(map).second = retFloat; float result2 = get< float >(map).second(); return 0; } 您可以替换函数的返回类型或函数本身.或者您可以保持原样,并在需要更多参数的情况下进行绑定. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |