Re: Is this legal C++?
On Jun 8, 6:21 am, arrowtackett <arrowtack...@gmail.com> wrote:
Below is a small piece of code that I'm curious about. It is a
recursive template function that accepts a vector of any dimension.
The function returns the dimension of the vector passed into it. It
seems that the typename parameter "A" is allowed to be a template
itself. This code doesn't give me any warnings, but Is this legit C+
+? I had never seen this before, and I have just recently discovered
this by accident. If this is indeed legal C++, this is a very nice
way for a function to accept N-dimensional vectors.
// file.cpp
#include <iostream>
#include <vector>
using namespace std;
template<typename A> int getDimension(const vector<A> &, int = 0);
template<typename A> int getDimension(const A &, int);
template<typename A>
int getDimension(const vector<A> &vec, int dims = 0) {
++dims;
int totalDims = getDimension(vec[0], dims);
return totalDims;
}
// Overloaded function that is called when the typename
// parameter is not a vector (the last recursive iteration)
template<typename A>
int getDimension(const A &vec, int dims) {
return dims;
}
int main() {
typedef vector<double> V1;
typedef vector<vector<double> > V2;
typedef vector<vector<vector<double> > > V3;
V3 vec3D(2, V2(3, V1(4, 0.0)));
int dim = getDimension(vec3D);
cout << "The dimension of the vector is: " << dim << endl;
return 0;
}
While it works, it is not quite correct. The reason being that
std::vector<> has two template arguments. Some compilers allow to omit
the template arguments of a template for which there is a default
value (std::vector<> has a default value for its second template
argument). So, to be pedantically precise and portable getDimension
signature should be:
template<class T, class A>
int getDimension(const vector<T, A> &vec, int dims = 0);
Aside from that, it can be more efficient by not using function
recursion, rather using compile time template recursion, i.e.:
template<class T>
struct GetDimension
{
static int const value = 1;
};
template<class T, class A>
struct GetDimension<std::vector<T, A> >
{
static int const value = 1 + GetDimension<T>::value;
};
template<class T>
int getDimension(T const&)
{
return GetDimension<T>::value;
}
--
Max
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]