2

In the C++ code below, the templated Check function gives an output that is not what I would like: it's 1 instead of 3. I suspect that K is mapped to int*, not to int[3] (is that a type?). I would like it to give me the same output than the second (non templated) function, to which I explicitly give the size of the array...

Short of using macros, is there a way to write a Check function that accepts a single argument but still knows the size of the array?

#include <iostream>
using namespace std;

int data[] = {1,2,3};

template <class K>
void Check(K data) {
  cout << "Deduced size: " << sizeof(data)/sizeof(int) << endl;
}

void Check(int*, int sizeofData) {
  cout << "Correct size: " << sizeofData/sizeof(int) << endl;
}

int main() {
  Check(data);
  Check(data, sizeof(data));
}

Thanks.

PS: In the real code, the array is an array of structs that must be iterated upon for unit tests.

2
  • Better to use a std::vector instead of an array. Commented Dec 9, 2009 at 13:17
  • 2
    In your original code, the type K degenerates to a pointer when you pass an array to Check. This is normal C/C++ behavior, with or without templates involved. Fortunately, C++ provides a mechanism to preserve the array size, by using an integral constant as a template parameter. See Alexey Malistov's answer for more details. Commented Dec 9, 2009 at 13:21

1 Answer 1

10
template<class T, size_t S> 
void Check(T (&)[S]) {  
   cout << "Deduced size: " << S << endl;
}
Sign up to request clarification or add additional context in comments.

1 Comment

can you explain it please?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.