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 用于宏?)。另外,请注意您的示例调用可能会混淆 T
和 U
.
两件事,
- 不要在
CastTo<U>
、 的定义中使用 <U>
- 调换
template
行中 T
和 U
的顺序。
首先是 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
}
我想使用模板将 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 用于宏?)。另外,请注意您的示例调用可能会混淆 T
和 U
.
两件事,
- 不要在
CastTo<U>
、 的定义中使用 - 调换
template
行中T
和U
的顺序。
<U>
首先是 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
}