从迭代器转换为变量的类型.(C++11 模板)

Convert from iterator to the type of the variable. (C++11 Template)

本文关键字:C++11 模板 类型 迭代器 转换 变量      更新时间:2023-10-16

我有模板类,其中包含一个向量和默认值

T _default;
vector<T> Vals;

我想迭代它并根据默认值类型(字符串/整数/双精度(打印值。

所以我写了

if (typeid(int) == typeid(_default))
{
for each(auto itr in Vals)
{
//logic to process each element in vector
int temp;
//temp = *itr; <------ how to convert from iterator to the value (value held in vector)
}
}
else if (typeid(string) == typeid(_default))
{
for each(auto itr in Vals)
{         //logic to process each element in vector
string temp;
//temp = *itr; <------ how to convert from iterator to the value (value held in vector)

}
}
else if (typeid(double) == typeid(_default))
{
for each(auto itr in Vals)
{
//logic to process each element in vector
double temp;
//temp = *itr; <------ how to convert from iterator to the value (value held in vector)
}
}

如何将迭代器转换为相应的整数/字符串/双精度。当我使用*itr取消引用它时,会给我error C2100: illegal indirection错误。

更新: 抱歉更新 - 但我实际上想将字符串的值进行比较,例如string validateStrvector<T> Vals中包含的值。所以我需要知道存储在Vals中的值的类型,然后通过执行(字符串到整数(/(字符串到双精度(/(字符串(按原样((到Vals中的每个值来比较字符串。所以基本上这段代码将检查_default值是否实际上是允许Vals中存在的任何值。

在范围循环中,"迭代变量"具有元素的类型。
它不是一个迭代器。

你不能像这样编写函数,因为无论T是什么,整个函数都必须是类型正确的。

您可以做的是使用重载(或模板化(函数并将值传递给该函数:

void print(int i) { cout << "int " << i; }
void print(string s) { cout << "string " << s; }
// ...
for (auto v: Vals)
{
print(v);
}

似乎您缺少模板的重点。这个想法是,您可以创建处理所有情况的通用代码。例如,您说要:

我想迭代它并根据_default类型(string/int/double(打印值

在这种情况下,我会说你应该在你的类中创建一个print方法。例如:

void print() { for(const T& i : Vals) cout << i << ' '; }

现场示例

首先,拥有模板的全部意义在于避免您尝试对类执行的操作。 除了您可以使用专用模板获得相同的结果之外,为什么不尝试auto temp = *itr;或更好的类型仍然键入 cast(*itr(,但我仍然建议尝试模板专用化。

模板专用化的小示例片段是

template<typename T>
T add(T v1, T v2){
return v1 + v2;
}
template <> double add(double v1, double v2){ return v1 + v2; }
template <> std::string add(std::string v1, std::string v2){ 
return v1 + v2; 
}
template <> const char* add(const char* v1, const char* v2){ 
return add(std::string(v1),std::string(v2)).c_str(); 
}
int main(){
std::cout << add(1, 3) << std::endl;
std::cout << add(2.6, 4.0) << std::endl;
std::cout << add("str", "ing") << std::endl;    
}