在类型上模板化的类和" getter"

时间:2014-06-09 19:41:09

标签: c++ templates

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

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作为模板参数,但我不认为传递函数值是可能的,所以我使用了结构类型。

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

3 个答案:

答案 0 :(得分:2)

据我了解你的习语,你正在重新发明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...

好处是你将能够封装成员和非成员函数,lambdas和自由函数。

答案 1 :(得分:0)

嗯,有几种选择:

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

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

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

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

使用在concreteT中定义的getter和setter初始化构造函数中的指针(而不是模板参数)。

3)2的模板版本是解释器

Passing a pointer to a member function as a template argument. Why does this work?

我不明白你的意思是什么&#34;功能UseTs ...&#34;所以它可能不是一个好的解决方案,希望我能帮忙

答案 2 :(得分:-1)

我没有使用模板,而是使用strategy pattern