C++ 转换向量模板

C++ cast vector template

我想使用模板将 BaseClass 转换为 DerivedClass std 向量:

template<typename T, typename U>
vector<U> CastTo<U>(vector<T> &input)
{
    vector<U> output;
    for (auto obj : input)
    {
        output.push_back(dynamic_cast<U>(obj));
    }
    return output;
}

这可能吗?

目前无法识别模板,我无法使用它。建议的方式有错误吗?

用法是:

vector<BaseClass*> vec;
vector<DerivedClass*> dVec = CastTo<DerivedClass*>(vec);
template<typename T, typename U>
vector<U> CastTo<U>(vector<T> &input)
                ^^^

删除 <U>(为什么 ALL_UPPERCASE 用于宏?)。另外,请注意您的示例调用可能会混淆 TU.

两件事,

  1. 不要在 CastTo<U>
  2. 的定义中使用 <U>
  3. 调换 template 行中 TU 的顺序。

首先是 C++ 中函数模板的语法:名称后没有模板括号。 (但调用函数时需要一个。)

第二个比较棘手。如果您有一个 template<typename T, typename U> 函数并调用了 CastTo<DerivedClass*>(vec),那么 DerivedClass* 将与第一个参数 T 匹配,无法确定 U:

CastTo<DerivedClass*, ???>(vec): vector<DerivedClass*> &input -> ???
       ===== T =====  =U=                ↑ T

> template argument deduction/substitution failed:
> couldn't deduce template parameter ‘U’

如果是template<typename U, typename T>,那么U就是DerivedClass*T可以从函数的参数vec:

中找到
1. CastTo<DerivedClass*, ???>(vec): vector<???> &input -> vector<DerivedClass*>
          ===== U =====  =T=                     ↑ vec            ↑ U
2. vec is a vector<BaseClass*>  =>  T = BaseClass*

> OK

这有效(使用原始类型和 C-style 转换的最小示例):

#include <vector>

using namespace std;

template<typename U, typename T>
vector<U> CastTo(vector<T> &input)
{
    vector<U> output;
    for (auto obj : input)
    {
        output.push_back(U(obj));
    }
    return output;
}

int main() {
  vector<float> v{2,3,5};
  vector<int> w = CastTo<int>(v);
  return w[2];  // returns 5
}