繁体   English   中英

以类型和“ getter”为模板的类

[英]Class templated on type and “getter”

我有一个由类型参数化的类模板和一个用于为该类型提取值的函数

template <class T, class getT>
class MyClass{
  //holds a vector of T
  std::vector<T> Ts;
  function useTs(){
     f(getT{}(Ts[0])); 
  }
};

struct TGetter{
  someType operator()(const ConcreteT& myT){
     return myT.aField;
  }
}
struct TGetter2{
  someType operator()(const ConcreteT& myT){
     return myT.bField;
  }
}
MyClass<myT, TGetter> myInstance; 
MyClass<myT, TGetter2> myInstance2; 

有没有更优雅的表达方式? 我不希望每次要在T字段中实例化时都要实例化该结构。我认为构造/方法调用将得到优化,但这似乎是一个丑陋的解决方案。 我想将lambda作为模板参数传递,但是我认为传递函数值是不可能的,因此我改用struct类型。

有一点上下文:我有一组物理对象,并且我有一个加速度结构,需要使用每个对象的几个不同状态向量(currentPosition,oldPosition等)来构造。

据我了解您的习惯用法,您正在重新发明std :: function通用多态函数包装器以及一种在C ++中封装函数的有效方法。

myT foo1;
myT foo2;

std::function<void(myT)> getter1= &myT::TGetter;
getter1(foo1);
getter1(foo2);


std::function<void(myT)> getter2= &myT::TGetter2;
getter2(foo1);
getter2(foo2);

// etc...

令人高兴的是,您将能够封装成员和非成员函数,lambda和自由函数。

好吧,有几种选择:

1)丑陋的解决方案:给出一个内存偏移量。 并从内存中检索它。 不需要模板。

2)更优雅的解决方案(imo):

将函数指针保存在MyClass中,如下所示:

someType (T::*m_fptr)(const T&);

使用concreteT中定义的getter和setter初始化构造函数中的指针(而不作为templateparameter)。

3)2的模板版本在这里解释

将指针传递给成员函数作为模板参数。 为什么这样做?

我不明白您所说的“功能UseTs ...”的含义,因此它可能不是一个好的解决方案,希望我能为您提供帮助

除了使用模板之外,我还可以使用策略模式

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM