C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了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));
}

但问题是如何使地图获得指向某个特化的指针,例如

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

当我从元组获取一个元素并执行函数时,这是一个@R_607_9246@.现在,我们需要通过使用类型来找到元素,而不是获取一个元素.一点元编程:

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的数据类型映射到函数指针所遇到的程序开发问题。

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

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。