Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
Just in case you needed to, you can wrap an array into a struct/class and pass it by value to a function:
template<typename T, int N>
struct array {
T value[N];
T & operator[](int i) { return value[i]; }
};
template<typename T, int N>
void passByValue(array<T, N> a) {
cout << "Value in function:" << endl;
for (int i = 0; i < N; i++) a[i] = 1, cout << a[i] << endl; // prints 1's
}
int main() {
const int N = 5;
array<int, N > a;
for (int i = 0; i < N; i++) a[i] = 0;
passByValue(a);
cout << "Value after function call:" << endl;
for (int i = 0; i < N; i++) cout << a[i] << endl; // prints 0's
return 0;
}
Comments
Anonymous
August 07, 2009
An good example about template :)Anonymous
August 07, 2009
That's a real cool stuff. :-) Thanks for this post.Anonymous
August 07, 2009
I have often used such a struct. With more extended use, I had to add a const version of operator[], to maintain array semantics. When I'm not passing the array by value, I would need a const version (constant reference) -- I shouldn't have to unbox the array: const T& operator[](int i) const { return value[i]; } To use your output example: template<typename T, int N> void print(const array<T, N>& a) { for (int i = 0; i < N; i++) cout << a[i] << endl; } While we're at it, what if I want to pass the array to an STL algorithm (or another that uses iterators), or need to grab hold of the array itself? T* operator&() { return value; } T* const operator&() const { return value; } So you can do, say: sort(&a, &a+N); It does look a bit ugly when you actually use it, but hey, this is C++. :-)Anonymous
August 08, 2009
Take a look at boost:array. DejanAnonymous
August 08, 2009
@Remoun Great addition indeed. @djelovic I hope boost makes it to the standards in 2010