C ++投射矢量模板

时间:2018-03-19 10:19:51

标签: c++ vector dynamic-cast

我想使用模板将BaseClass强制转换为DerivedClass标准向量:

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);

2 个答案:

答案 0 :(得分:4)

template<typename T, typename U>
vector<U> CastTo<U>(vector<T> &input)
                ^^^

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

答案 1 :(得分:3)

两件事,

  1. 请勿在{{1​​}}的定义中使用<U>
  2. CastTo<U>行中交换TU的顺序。
  3. 第一个是函数模板的语法在C ++中的用法:名称后面没有模板括号。 (但是在调用函数时你需要一个。)

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

    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>UDerivedClass*可以从函数的参数T中找到:

    vec

    这是有效的(使用基本类型和C样式转换的最小示例):

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