查看您的问题和您提供的代码后;正如其他人所说,您无法使用位移或流操作符来推进指针。基本的指针算术就绰绰有余了。如果你想要一些更精细的封装,然后通过创建 2 组类模板来查看我在这里所做的事情。第一个只需要size_t 并且始终是char,第二个需要type T 和size_t。这些是简单的结构,只包含一个内部数组(出于演示目的而保留为公共)、大小、默认构造函数和可变参数初始化构造函数。一旦我创建了这些类,我没有执行“指针算术”,而是为这两个类创建了 pre & post inc/dec operators。在这些运算符中,我没有执行“指针算术”,而是使用内部数组以您想要的行为来操作数据。代码如下:
Arrays.h
#ifndef ARRAYS_H
#define ARRAYS_H
template<size_t n>
struct charArray {
static const size_t SIZE = n;
char arr_[SIZE];
charArray() {}
template<class... U>
charArray( U ... pack ) : arr_ { pack... } {
static_assert(sizeof...(U) <= n, "too many values");
}
};
template<size_t n>
inline charArray<n>& operator--( charArray<n>& arr );
template<size_t n>
inline charArray<n> operator--( charArray<n>& arr, int );
template<size_t n>
inline charArray<n>& operator++( charArray<n>& arr );
template<size_t n>
inline charArray<n> operator++( charArray<n>& arr, int );
template<typename T, size_t n>
struct myArray {
static const size_t SIZE = n;
T arr_[SIZE];
myArray() {}
template<class... U>
myArray( U ... pack ) : arr_ { pack... } {
static_assert(sizeof...(U) <= n, "too many values");
}
};
template<typename T, size_t n>
inline myArray<T, n>& operator--( myArray<T,n>& arr );
template<typename T, size_t n>
inline myArray<T, n> operator--( myArray<T, n>& arr, int );
template<typename T, size_t n>
inline myArray<T, n>& operator++( myArray<T, n>& arr );
template<typename T, size_t n>
inline myArray<T, n> operator++( myArray<T, n>& arr, int );
#include "Arrays.inl"
#endif // ARRAYS_H
Arrays.inl
template<size_t n>
inline charArray<n>& operator--( charArray<n>& arr ) {
int i = 0;
for ( ; i < arr.SIZE - 1; ++i ) {
char temp = arr.arr_[i];
arr.arr_[i] = arr.arr_[i + 1];
arr.arr_[i + 1] = temp;
}
arr.arr_[i] = ' ';
// return reference
return arr;
}
template<size_t n>
inline charArray<n> operator--( charArray<n>& arr, int ) {
charArray<n> temp = arr;
--arr;
return temp;
}
template<size_t n>
inline charArray<n>& operator++( charArray<n>& arr ) {
int i = arr.SIZE-1;
for ( ; i > 0; --i ) {
char temp = arr.arr_[i];
arr.arr_[i] = arr.arr_[i-1];
arr.arr_[i-1] = temp;
}
arr.arr_[0] = ' ';
// return reference
return arr;
}
template<size_t n>
inline charArray<n> operator++( charArray<n>& arr, int ) {
charArray<n> temp = arr;
++arr;
return temp;
}
template<typename T, size_t n>
inline myArray<T, n>& operator--( myArray<T,n>& arr ) {
int i = 0;
for ( ; i < arr.SIZE - 1; ++i ) {
T temp = arr.arr_[i];
arr.arr_[i] = arr.arr_[i + 1];
arr.arr_[i + 1] = temp;
}
arr.arr_[i] = static_cast<T>( 0 );
return arr;
}
template<typename T, size_t n>
inline myArray<T, n> operator--( myArray<T, n>& arr, int ) {
myArray<T, n> temp = arr;
--arr;
return temp;
}
template<typename T, size_t n>
inline myArray<T, n>& operator++( myArray<T, n>& arr ) {
int i = arr.SIZE-1;
for ( ; i > 0; --i ) {
T temp = arr.arr_[i];
arr.arr_[i] = arr.arr_[i-1];
arr.arr_[i-1] = temp;
}
arr.arr_[0] = static_cast<T>(0);
return arr;
}
template<typename T, size_t n>
inline myArray<T, n> operator++( myArray<T, n>& arr, int ) {
myArray<T, n> temp = arr;
++arr;
return temp;
}
Arrays.cpp
#include "Arrays.h";
main.cpp
#include <iostream>
#include "Arrays.h"
int main() {
// Start with the char array, initilize it & print to screen
std::cout << "Working with charArray<6>.\n";
charArray<6> cArr = { 'a', 'b', 'c', 'd', 'e', 'f' };
for ( int i = 0; i < cArr.SIZE; i++ ) {
std::cout << cArr.arr_[i] << " ";
}
std::cout << std::endl;
// Pre - Decrement
--cArr;
// Reprint
std::cout << "After Pre-Decrement operator.\n";
for ( int i = 0; i < cArr.SIZE; i++ ) {
std::cout << cArr.arr_[i] << " ";
}
std::cout << std::endl;
// Post - Decrement
cArr--;
// Reprint
std::cout << "After Post-decrement operator.\n";
for ( int i = 0; i < cArr.SIZE; i++ ) {
std::cout << cArr.arr_[i] << " ";
}
std::cout << std::endl;
// Pre - Decrement again
std::cout << "Pre-decrement again after post-decrement.\n";
--cArr;
for ( int i = 0; i < cArr.SIZE; i++ ) {
std::cout << cArr.arr_[i] << " ";
}
std::cout << std::endl << std::endl;
// ==================================================================
// Do Same for templated arrays:
std::cout << "Working with myArray<char,6>.\n";
myArray<char, 6> arr = { 'a', 'b', 'c', 'd', 'e', 'f' };
for ( int i = 0; i < arr.SIZE; i++ ) {
std::cout << arr.arr_[i] << " ";
}
std::cout << std::endl;
// Pre - Decrement
--arr;
std::cout << "After Pre-decrement operator.\n";
for ( int i = 0; i < arr.SIZE; i++ ) {
std::cout << arr.arr_[i] << " ";
}
std::cout << std::endl;
// Post - decrement
arr--;
std::cout << "After Post-decrement operator.\n";
for ( int i = 0; i < arr.SIZE; i++ ) {
std::cout << arr.arr_[i] << " ";
}
std::cout << std::endl;
// Pre - Decrement again
std::cout << "Pre-decrement again after post-decrement.\n";
--arr;
for ( int i = 0; i < arr.SIZE; i++ ) {
std::cout << arr.arr_[i] << " ";
}
std::cout << std::endl << std::endl;
// ==============================================================
std::cout << "Working with myArray<int,4>.\n";
myArray<int, 4> arr2 = { 1,2,3,4 };
for ( int i = 0; i < arr2.SIZE; i++ ) {
std::cout << arr2.arr_[i] << " ";
}
std::cout << std::endl;
// Pre - Decrement
--arr2;
std::cout << "After Pre-decrement operator.\n";
for ( int i = 0; i < arr2.SIZE; i++ ) {
std::cout << arr2.arr_[i] << " ";
}
std::cout << std::endl;
// Post - Decrement
arr2--;
std::cout << "After Post-decrement operator.\n";
for ( int i = 0; i < arr2.SIZE; i++ ) {
std::cout << arr2.arr_[i] << " ";
}
std::cout << std::endl;
// Pre - Decrement again
std::cout << "Pre-decrement again after post-decrement.\n";
--arr2;
for ( int i = 0; i < arr2.SIZE; i++ ) {
std::cout << arr2.arr_[i] << " ";
}
std::cout << std::endl << std::endl;
std::cout << "===========================================================.\n";
// ====================================================================
std::cout << "Testing charArray<5> With Pre-Increment.\n";
charArray<5> cArr2 = { 'j', 'k', 'l', 'm', 'n' };
for ( int i = 0; i < cArr2.SIZE; i++ ) {
std::cout << cArr2.arr_[i] << " ";
}
std::cout << std::endl;
std::cout << "Pre - Increment\n";
++cArr2;
std::cout << "After Pre-increment operator.\n";
for ( unsigned i = 0; i < cArr2.SIZE; i++ ) {
std::cout << cArr2.arr_[i] << " ";
}
std::cout << std::endl << std::endl;
std::cout << "Testing myArray<float, 7> With Pre-Increment.\n";
myArray<float, 7> fArr = { 1.1f, 1.2f, 1.3f, 1.4f, 1.5f, 1.6f, 1.7f };
for ( int i = 0; i < fArr.SIZE; i++ ) {
std::cout << fArr.arr_[i] << " ";
}
std::cout << std::endl;
std::cout << "Pre - Increment\n";
++fArr;
std::cout << "After Pre-increment operator.\n";
for ( unsigned i = 0; i < fArr.SIZE; i++ ) {
std::cout << fArr.arr_[i] << " ";
}
std::cout << std::endl << std::endl;
std::cout << "Post-increment operator.\n";
cArr2++;
fArr++;
std::cout << "After Post-Increment.\n";
for ( int i = 0; i < cArr2.SIZE; i++ ) {
std::cout << cArr2.arr_[i] << " ";
}
std::cout << std::endl;
for ( int i = 0; i < fArr.SIZE; i++ ) {
std::cout << fArr.arr_[i] << " ";
}
std::cout << std::endl;
// Pre-Increment again
std::cout << "Pre-increment again.\n";
++cArr2;
++fArr;
std::cout << "Pre-Increment after post-increment.\n";
for ( int i = 0; i < cArr2.SIZE; i++ ) {
std::cout << cArr2.arr_[i] << " ";
}
std::cout << std::endl;
for ( int i = 0; i < fArr.SIZE; i++ ) {
std::cout << fArr.arr_[i] << " ";
}
std::cout << std::endl;
std::cout << "\nPress any key and enter to quit." << std::endl;
char c;
std::cin >> c;
return 0;
}
请注意内部数组是公共的,并且所有循环和[] 或数组访问都使用内部SIZE 变量,因为没有数组边界检查。这只是表明您可以使用 ++() 和 --() operators 来执行您在任一顺序中描述的相同操作。
现在,如果您愿意,可以稍微更改 Pre -- 和 Pre ++ 以在任一方向上进行环绕,这样如果您正在执行 --(),第一个元素将移动到末尾而不是替换为0 如果你正在做++(),最后一个元素将成为第一个元素,但我将把它作为挑战留给你。