我如何实施以下
template <typename ITERATOR> void Swap (ITERATOR a, ITERATOR b) {
...
}
以便交换(a,b)交换a和b指向的值。 换句话说:如何在不知道数据类型的情况下创建第三个变量?
答案 0 :(得分:7)
这项工作只有iter_swap
:
std::iter_swap(a, b);
此外,如果您可以使用c ++ 11,则可以使用decltype
:
std::remove_reference<decltype(*a)>::type c = *a;
*a = *b;
*b = c;
答案 1 :(得分:6)
如何在不知道数据类型的情况下创建第三个变量?
使用std::iterator_traits<ITERATOR>::value_type
答案 2 :(得分:4)
在C ++ 11中,类型为std::remove_reference<decltype(*a)>::type
,但是为了声明变量,您可以使用auto
。
在C ++ 03中,推断任意表达式类型的最可靠方法是通过另一个模板:
// NOTE: This is for illustration only. If you are simply swapping
// values, use 'std::swap' instead of this, since that is specialised
// for many types to avoid unnecessary copy-assignment.
template <typename T> void value_swap(T & a, T & b) {
T t = a;
a = b;
b = t;
}
template <typename I> void iterator_swap(I a, I b) {
value_swap(*a, *b);
}
或者,对于行为良好的迭代器(包括指针和标准迭代器),类型可用作std::iterator_traits<ITERATOR>::value_type
。如果有人编写了自己的迭代器类型而没有提供默认iterator_traits
所需的嵌套类型或者为其专门设置iterator_traits
,那么这将无效。
某些编译器提供类似于decltype
的非标准扩展名;例如,GCC提供typeof
。如果你不需要你的代码可以移植,你可以使用这样的东西。
顺便说一句,您的特定功能已经存在std::iter_swap
。
答案 3 :(得分:3)
template <typename ITERATOR> void Swap (ITERATOR a, ITERATOR b) {
using std::swap;
swap(*a,*b);
}
答案 4 :(得分:2)
迭代器有一个所谓的特性,用于定义它的值类型。
iterator_traits<ITERATOR>::value_type temp = *a;
*a = *b;
*b = temp;