3

我怎样才能实现例如以下

template <typename ITERATOR> void Swap (ITERATOR a, ITERATOR b) {
  ...
}

以便 Swap(a, b) 交换 a 和 b 所指向的值。换句话说:如何在不知道数据类型的情况下创建第三个变量?

4

5 回答 5

7

只是iter_swap为了那个工作:

std::iter_swap(a, b);

此外,如果您可以使用 c++11,您可以使用decltype

std::remove_reference<decltype(*a)>::type c = *a;
*a = *b;
*b = c;
于 2012-04-11T14:14:02.723 回答
6

如何在不知道数据类型的情况下创建第三个变量?

采用std::iterator_traits<ITERATOR>::value_type

于 2012-04-11T14:14:06.190 回答
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.

于 2012-04-11T14:28:17.630 回答
3
template <typename ITERATOR> void Swap (ITERATOR a, ITERATOR b) {
  using std::swap;
  swap(*a,*b);
}
于 2012-04-11T14:16:02.317 回答
2

迭代器有一个所谓的特征来定义它的值类型。

        iterator_traits<ITERATOR>::value_type temp = *a;
        *a = *b;
        *b = temp; 
于 2012-04-11T14:12:22.073 回答