Hallo Leute.
Ich habe mir mal vorgenommen mich mit Template Meta Programmierung auseinanderzusetzen. Wollte mal versuchen z.B. einen T** zu T zu dereferenzieren. Nur habe ich irgendwie keine Ahnung wie ich das anstellen soll. Ich kann von T** auf T* oder von T* auf T dereferenzieren (also auch von T** auf T nur das dafür müsste ich die Funktion 2 mal hintereinander aufrufen), aber ich würde gerne eine Funktion haben die N mal dereferenziert. Hat jemand eine Ahnung wie man das implementieren könnte ? Als Funktionsdefinition würde ich sowas benutzen:
Hier ist der code den ich bis jetzt habe:
Ich hoffe jemand kann mir helfen. Würde mich auch sehr über Verbesserungsvorschläge von meinem jetzigen Code freuen.
Ich habe mir mal vorgenommen mich mit Template Meta Programmierung auseinanderzusetzen. Wollte mal versuchen z.B. einen T** zu T zu dereferenzieren. Nur habe ich irgendwie keine Ahnung wie ich das anstellen soll. Ich kann von T** auf T* oder von T* auf T dereferenzieren (also auch von T** auf T nur das dafür müsste ich die Funktion 2 mal hintereinander aufrufen), aber ich würde gerne eine Funktion haben die N mal dereferenziert. Hat jemand eine Ahnung wie man das implementieren könnte ? Als Funktionsdefinition würde ich sowas benutzen:
Code:
template<typename T, int i, int n>
typename ptr_holder<T, i - n>::type dereference_ptr(typename ptr_holder<T, i>::type pointer)
{
// ???
}
Code:
template<typename T, int i>
struct ptr_holder
{
typedef typename boost::add_pointer<typename ptr_holder<T, i - 1>::type>::type type;
};
template<typename T>
struct ptr_holder < T, 1 >
{
typedef typename boost::add_pointer<T>::type type;
};
template<typename T>
struct ptr_holder < T, 0 >
{
typedef T type;
};
template <typename T, int i>
typename ptr_holder<T, i - 1>::type dereference_ptr(typename ptr_holder<T, i>::type pointer)
{
return *pointer;
}
int main(int argc, char** ppArgv)
{
ptr_holder<char, 2>::type ppTest = new char*("Test");
ptr_holder<char, 1>::type pTest = dereference_ptr<char, 2>(ppTest);
std::cout << pTest << std::endl;
return 0;
}