Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 类模板化在类型和“上”;“吸气剂”;_C++_Templates - Fatal编程技术网

C++ 类模板化在类型和“上”;“吸气剂”;

C++ 类模板化在类型和“上”;“吸气剂”;,c++,templates,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){

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

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; 
模板
类MyClass{
//保持T的向量
std::向量Ts;
函数useTs(){
f(getT{}(Ts[0]);
}
};
结构TGetter{
someType运算符()(const-concrete-t&myT){
返回myT.aField;
}
}
结构TGetter2{
someType运算符()(const-concrete-t&myT){
返回myT.bField;
}
}
MyClass myInstance;
MyClass myInstance2;
有没有更优雅的方式来表达这个成语?我不喜欢每次我想在t中获取字段时都必须实例化结构。我假设构造/方法调用将得到优化,但这似乎是一个丑陋的解决方案。我想将lambda作为模板参数传递,但我认为传递函数值是不可能的,所以我改用了struct类型


一点背景:我有一组物理对象,我有一个加速结构,我需要使用每个对象的几个不同状态向量(currentPosition、oldPosition等)来构造它

嗯,有几种选择:

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

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

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

someType (T::*m_fptr)(const T&);
使用Concrete中定义的getter和setter初始化构造函数中的指针(而不是templateparameter)

3) 此处解释了2的模板版本


我不理解你所说的“函数USPET……”,所以它可能不是好的解决方案,希望我能帮助

而不是使用模板,我会使用.< /p> < p>至于我理解你的成语,你正在重新创建一个通用的多态函数包装器,以及一个强大的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...
myT-foo1;
myT-foo2;
std::function getter1=&myT::TGetter;
getter1(foo1);
getter1(foo2);
std::function getter2=&myT::TGetter2;
getter2(foo1);
getter2(foo2);
//等等。。。

很好的一点是,您将能够封装成员和非成员函数、lambda和自由函数。

我不明白为什么不在类模板中直接调用这些getter?请看底部的实例化。我对两个不同的getter使用相同的T参数。我不知道你的建议是什么。我只是想知道你为什么不在需要时直接调用myT.aField,而不是使用模板包装该调用。@quantdev他有时想让同一个函数调用bfield.UseTs只是表明,即使我将T存储在类中,我也要选择一个特定的字段(在下面的例子中,它是aField或bField)并用它进行一些计算。我想我应该注意到f需要一个
someType
参数。是的,但是我必须在类中存储getter1或getter2,而不是将我的结构类型作为模板参数传递。