从模板中的类中获取类型

时间:2014-10-14 03:19:13

标签: c++ templates

对不起,这是一个冗长的问题,但这是一个特定的问题。

假设我有两个课程,type1type2

struct type1 {
    int getVal() {
        return int();
    }
};
struct type2 {
    float getVal() {
        return float();
    }
};

如您所见,除getVal()返回的类型外,它们执行相同的功能。现在,假设我想创建一个接受type1type2作为输入的函数,并输出各自类型的std::vector int和{ {1}}。

我认为这样做的方法是创建一个这样的模板函数:

float

这几乎可行,但正如您从template<class T> vector<oh dear> something(T input) { return {input.getVal(),input.getVal()}; } 所看到的,我无法创建正确的向量类型来返回。所以我想到了一个解决方案:只需输入oh deartype1类中返回的类型,如:

type2

并将功能更改为:

struct type1 {
    int getVal() {
        return int();
    }
    typedef int subtype;
};
struct type2 {
    float getVal() {
        return float();
    }
    typedef float subtype;
};

哪个不编译。有没有办法解决我遇到的问题?

1 个答案:

答案 0 :(得分:2)

您需要在typename之前添加T::subtype关键字,告诉编译器它是一个类型

template<class T> 
std::vector<typename T::subtype> something(T input) {
    return {input.getVal(),input.getVal()};
}

In Coliru

使用C ++ 11,您可以让编译器自动计算出类型

template<class T> 
auto something(T input) -> std::vector<decltype(input.getVal())>  {
    return {input.getVal(),input.getVal()};
}

In Coliru