如何确定从类模板继承的模板参数的基础模板类型?

用户名

以前可能已经有人问过并回答过这个问题,但我一直无法弄清楚要找到的搜索词。这是一些显示我的问题的代码(拟作伪代码...如果需要,请澄清)。

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

模板类参数继承

来自分类Dev

确定模板中模板参数的类型

来自分类Dev

模板类如何从嵌套模板类继承

来自分类Dev

从继承类型推导模板参数

来自分类Dev

从继承类型推导模板参数

来自分类Dev

如何使用类的类型作为模板的参数

来自分类Dev

模板类的模板参数

来自分类Dev

如何确保迭代器模板参数与模板类的模板参数具有相同的数据类型

来自分类Dev

“模板模板参数的模板参数必须是类模板或类型别名模板”

来自分类Dev

“模板模板参数的模板参数必须是类模板或类型别名模板”

来自分类Dev

如何指定模板参数为类模板,并从另一个模板参数推断其模板类型?

来自分类Dev

有没有办法确定模板类的模板参数类型?

来自分类Dev

给定模板参数,如何确定这是否实际上是参数化的模板类?

来自分类Dev

如何使用模板模板参数专门化类模板?

来自分类Dev

从具有默认参数的类模板继承

来自分类Dev

以子类作为模板参数继承类

来自分类Dev

从模板类继承,在子类中声明类型

来自分类Dev

当可变参数模板类从模板参数继承时,在调用基类型的方法时扩展参数包

来自分类Dev

C ++:从模板参数继承

来自分类Dev

C ++继承模板类

来自分类Dev

模板类的多重继承

来自分类Dev

C ++模板类继承

来自分类Dev

内部模板类的继承

来自分类Dev

C ++继承模板类

来自分类Dev

模板模板非类型参数

来自分类Dev

类模板:限制模板参数

来自分类Dev

模板类作为模板参数

来自分类Dev

Haskell多参数类(模板类型类)

来自分类Dev

Java模板如何返回带有模板类型的函数参数类类型实例