gpt4 book ai didi

c++ - 如何确定从类模板继承的模板参数的底层模板类型?

转载 作者:行者123 更新时间:2023-11-28 00:01:31 25 4
gpt4 key购买 nike

这可能已经被询问和回答过,但我一直无法找出搜索词来找到它。这是一些代码来显示我的问题(旨在作为伪代码......如果需要请澄清)。

图片.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];
}

特殊图像.h

class SpecialImage : public Image<float>
{

}

堆栈.h

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.
}
}

主要.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 类型不会被强制匹配图像的底层模板类型。

这里是否存在固有的设计缺陷?有没有办法在堆栈级别获取类型 L?

最佳答案

执行此操作的经典方法是在您的 Image 中放置一个 typedef/别名类,类似

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.
}
}

这些类型定义基本上被标准库中的每个模板类使用:例如,std::vector<T>包含(除其他外)一个成员 typedef value_type这是 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.
}
}

[普通autoauto* 一样有效, 但我更喜欢后者,因为它清楚地表明您期待的是指针类型。]

最后,在 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 的东西.

关于c++ - 如何确定从类模板继承的模板参数的底层模板类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38614831/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com