Template/Macro constructor problem


How can I do a constructor for a position with 1000 dimensions just with/or macro preprocessing.


Here is my code, many thanks to you all
(PS I don't want to use array, vector ... or even m4):


Position.hpp
------------
#ifndef POSITION_HPP_INCLUDED
#define POSITION_HPP_INCLUDED
/* ************************************************************************** */
#define templateParentClassDeclaration_Position(dimName, attribName)\
templatePCDec_Position(dimName, attribName)
#define templateParentClassMethodDefinition_Position_getDim(dimName, attribName)\
templatePCMDef_Position_getDim(dimName, attribName)
#define templateParentClassMethodDefinition_Position_setDim(dimName, attribName)\
templatePCMDef_Position_setDim(dimName, attribName)
#define templateParentClassMethodsDefinition(dimName, attribName)\
templatePCMDef_Position(dimName, attribName)
#define templateParentClassMethodDefinition_Position_Construct(dimName, attribName)\
templatePCMDef_Position_Construct(dimName, attribName)



#define templatePCDec_Position(dimName, attribName)\
template<typename T_dimType>\
class Position_##dimName {\
private:\
T_dimType _##attribName;\
public:\
Position_##dimName();\
Position_##dimName(T_dimType & attribName);\
T_dimType attribName() const;\
void set_##attribName(const T_dimType &new_##attribName);\
}

#define templatePCMDef_Position_getDim(dimName, attribName)\
template<typename T_dimType>\
T_dimType Position_##dimName<T_dimType>::attribName() const{\
return _##attribName;\
}

#define templatePCMDef_Position_setDim(dimName, attribName)\
template<typename T_dimType>\
void Position_##dimName<T_dimType>::set_##attribName(const T_dimType &new_##attribName){\
_##attribName = new_##attribName;\
}

#define templatePCMDef_Position_Construct(dimName,attribName)\
template<typename T_dimType>\
Position_##dimName<T_dimType>::Position_##dimName\
(T_dimType &attribName) : _##attribName(attribName){\
}\
\
template<typename T_dimType>\
Position_##dimName<T_dimType>::Position_##dimName\
() : _##attribName(0){\
}\


#define templatePCMDef_Position(dimName, attribName)\
templatePCMDef_Position_setDim(dimName, attribName)\
templatePCMDef_Position_getDim(dimName, attribName)\
templatePCMDef_Position_Construct(dimName, attribName)



/* ************************************************************************** */

#define templateChildClassDeclaration_Position(dimName, parentDimName, attribName)\
templateCCDec_Position(dimName, parentDimName, attribName)
#define templateChildClassMethodDefinition_Position_getDim(dimName, attribName)\
templateCCMDef_Position_getDim(dimName, parentDimName, attribName)
#define templateChildClassMethodDefinition_Position_setDim(dimName, attribName)\
templateCCMDef_Position_setDim(dimName, attribName)
#define templateChildClassMethodsDefinition(dimName, attribName)\
templateCCMdef_Position(dimName, attribName)



#define templateCCDec_Position(dimName, parentDimName, attribName)\
template<typename T_dimType>\
class Position_##dimName : public Position_##parentDimName<T_dimType> {\
private:\
T_dimType _##attribName;\
public:\
T_dimType attribName() const;\
void set_##attribName(const T_dimType &new_##attribName);\
}

#define templateCCMDef_Position_getDim(dimName, attribName)\
template<typename T_dimType>\
T_dimType Position_##dimName<T_dimType>::attribName() const{\
return _##attribName;\
}

#define templateCCMDef_Position_setDim(dimName, attribName)\
template<typename T_dimType>\
void Position_##dimName<T_dimType>::set_##attribName(const T_dimType &new_##attribName){\
_##attribName = new_##attribName;\
}

#define templateCCMdef_Position(dimName, attribName)\
templateCCMDef_Position_getDim(dimName, attribName)\
templateCCMDef_Position_setDim(dimName, attribName)


/* ************************************************************************** */
templatePCDec_Position(1D,x);
templatePCMDef_Position(1D,x);

templateCCDec_Position(2D,1D,y);
templateCCMdef_Position(2D,y);
templateCCDec_Position(3D,2D,z);
templateCCMdef_Position(3D,z);
/* ************************************************************************** */
#define Position(nbDim, dimType) Position_##nbDim##D<dimType>
/* ************************************************************************** */
#endif //ifndef POSITION_HPP_INCLUDED





main.cpp
--------
#include "Position.hpp"
#include <iostream>

int main(int argc, char const **argv){
Position(3,int) *toto = new Position(3,int)();
toto->set_z(6);
std::cout << toto->z() << std::endl;
return 0;
}
I've just seen variadic template. I'm very tired, but I'll see more tomorrow. I'll give you a response when time will permit it.
Topic archived. No new replies allowed.