以前可能已经有人问过并回答过这个问题,但我一直无法弄清楚要找到的搜索词。这是一些显示我的问题的代码(拟作伪代码...如果需要,请澄清)。
Image.h:
template <class T>
class Image
{
public:
// Return pointer to data.
T* GetValues();
std::vector<T> data_;
};
template <class T>
T* Image<T>::GetValues()
{
return &data_[0];
}
SpecialImage.h
class SpecialImage : public Image<float>
{
}
堆栈
template<class T>
class Stack
{
public:
void NegateAllImageValues();
std::vector<T> stackOfImages_;
};
template <class T>
void Stack::NegateAllImageValues()
{
for(int i = 0; i < stackOfImages_.size(); ++i)
{
// Type L should be float if T=SpecialImage, but how to get?
L* imageValues = stackOfImages_.at(i).GetValues();
// Loop over values and multiply by -1.0.
}
}
main.cpp
{
// Create stack of SpecialImages.
Stack<SpecialImage> myStack;
// Create special image and add some data.
SpecialImage mySpecialImage;
mySpecialImage.data_.push_back(1.0f);
mySpecialImage.data_.push_back(2.0f);
mySpecialImage.data_.push_back(3.0f);
// Add special image to stack.
myStack.stackOfImages_.push_back(mySpecialImage);
// Negate all values in all SpecialImages in the stack.
myStack.NegateAllImageValues();
}
我的问题是如何知道Stack :: NegateAllImageValues中的L类型?我意识到我可以编写一个Image :: NegateAllValues方法并从Stack :: NegateAllImageValues调用它,但是我想知道是否有一种方法可以在堆栈级别获取类型L。我想我可以向函数Stack :: NegateAllImageValues添加额外的模板参数,例如
template <class T, class L>
void Stack::NegateAllImageValues()
{
for(int i = 0; i < stackOfImages_.size(); ++i)
{
// Type L should be float if T=SpecialImage, but how to get?
L* imageValues = stackOfImages_.at(i).GetValues();
// Loop over values and multiply by -1.0.
}
}
但是类型L不会被强制匹配Image的基础模板类型。
这里是否存在固有的设计缺陷?有没有办法在堆栈级别获取类型L?
做到这一点的经典方法是在您的Image
类中放入typedef / alias ,例如
template <typename T>
class Image {
public:
typedef T value_type;
// Other stuff
};
然后在您的Stack::NegateAllImageValues()
方法中,您可以说
template <class T>
void Stack::NegateAllImageValues()
{
for(int i = 0; i < stackOfImages_.size(); ++i)
{
typename T::value_type* imageValues = stackOfImages_.at(i).GetValues();
// Loop over values and multiply by -1.0.
}
}
这些类型的typedef基本上由标准库中的每个模板类使用:例如,std::vector<T>
包含(除其他外)成员typedef value_type
,该成员是typedef的别名T
。
C ++ 11和更高版本中的替代方法是使用auto
替代方法,例如:
template <class T>
void Stack::NegateAllImageValues()
{
for(int i = 0; i < stackOfImages_.size(); ++i)
{
auto* imageValues = stackOfImages_.at(i).GetValues();
// Loop over values and multiply by -1.0.
}
}
[auto
简单的方法与一样好auto*
,但是我更喜欢后者,因为它清楚地表明您期望使用指针类型。]
最后,在C ++ 11中,您可以decltype
用来获取的返回类型GetValues()
:
template <class T>
void Stack::NegateAllImageValues()
{
for(int i = 0; i < stackOfImages_.size(); ++i)
{
using value_type = decltype(stackOfImages_.at(i).GetValues());
value_type imageValues = stackOfImages_.at(i).GetValues();
// Loop over values and multiply by -1.0.
}
}
尽管这并不能真正使您受益匪浅auto
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句