c++ - 从模板中的类获取类型

标签 c++ templates

抱歉,这是一个冗长的问题,但这是一个具体的问题。

假设我有两个类,type1type2:

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

正如您所看到的,除了 getVal() 返回的类型之外,它们执行相同的功能。现在,假设我想要创建一个接受 type1type2 作为输入的函数,并输出 std::vector它们各自的类型:intfloat

我的想法是创建一个像这样的模板函数:

template<class T> vector<oh dear> something(T input) {
    return {input.getVal(),input.getVal()};
}

这几乎可以工作,但是正如您从哦亲爱的中看到的,我无法创建要返回的正确类型的 vector 。所以我想到了一个解决方案:简单地 typedef 在 type1type2 类中返回的类型,如下所示:

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

并将函数更改为:

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

这不能编译。有什么办法可以解决我遇到的问题吗?

最佳答案

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

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

关于c++ - 从模板中的类获取类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26352093/

相关文章:

c++ - 特征未对齐断言

c++ - 使用 tbb 并行化视频转换程序

c++ - 将函数模板传递给具有任意参数列表的函数模板

python - Mako 中的方 block 和防御

C++:强制完成模板编译(MSVC/G++)

c++ - 如何测试是否存在模板函数特化

c++ - 为什么我不能在 C++ 的三元条件语句中使用 "break"语句?

c++ - 从 C++ 调用 Python 函数

c# - pinvoke - 传递一个字符串 [] 作为输出参数

c++ - 为什么(或何时)模板引入其命名空间?