我有一个由类型参数化的类模板和一个用于为该类型提取值的函数
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类型。
有一点关系:我有一组物理对象,并且我需要使用每个对象的几个不同状态 vector (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和自由函数。