从迭代器转换为变量的类型.(C++11 模板)
Convert from iterator to the type of the variable. (C++11 Template)
我有模板类,其中包含一个向量和默认值
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 validateStr
与vector<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;
}
相关文章:
- 带有void类型和参数的C++11模板专用化
- C++11 模板函数"implicity"将位集<N>转换为"unsigned long"
- 从迭代器转换为变量的类型.(C++11 模板)
- C++11 模板解析错误,使用模板别名键入推导
- 奇怪的错误C++ 11 模板类
- C 11模板子类型
- C 11模板代码 - 无法在XCode中编译
- 看不懂C++11模板函数参数推导
- C++11:模板专用化的 constexpr 成员的标准参考需要额外声明
- Doxygen 对 C++11 模板别名的支持("using"语法)?
- C++11 模板函数别名与包装器
- C++11 模板别名作为模板模板参数会导致不同的类型
- C++11 模板类型别名以减少痛苦
- c++11模板工厂模式和带参数的构造函数
- C++11:模板 (TMP) 中的(递归)指针算法
- 如何在C++11模板中只在定义函数时调用该函数
- C++11模板参数,基本定义的部分特化错误
- C++11 - 模板,朋友,decltype和访问修饰符
- c++11模板特化包装器
- c++11:模板参数无效