c – 如何使std :: data的数据类型映射到函数指针

c – 如何使std :: data的数据类型映射到函数指针,第1张

概述我有这样的数据结构 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] = 我有这样的数据结构

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,参见示例和工厂:
https://github.com/alekstheod/tnnlib/blob/master/src/Utilities/Utilities/Design/Factory.h

按类型查看:
https://github.com/alekstheod/tnnlib/blob/master/src/Utilities/Utilities/MPL/Tuple.h

从这里开始:

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;}

您可以替换函数的返回类型或函数本身.或者您可以保持原样,并在需要更多参数的情况下进行绑定.

总结

以上是内存溢出为你收集整理的c – 如何使std :: data的数据类型映射到函数指针全部内容,希望文章能够帮你解决c – 如何使std :: data的数据类型映射到函数指针所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1227660.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存