Metaprogramming dereference pointer

09/18/2014 16:09 th0rex#1
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:
Code:
template<typename T, int i, int n>
typename ptr_holder<T, i - n>::type dereference_ptr(typename ptr_holder<T, i>::type pointer)
{
	// ???
}
Hier ist der code den ich bis jetzt habe:
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;
}
Ich hoffe jemand kann mir helfen. Würde mich auch sehr über Verbesserungsvorschläge von meinem jetzigen Code freuen.
09/18/2014 18:38 Tasiro#2
Funktionen können nicht partiell spezialisiert werden, nur Klassen. Daher die Helfer-Klasse.
Die ptr_holder-Klasse ist nicht notwendig. Theoretisch ist es nicht einmal notwendig, dass die zu dereferenzierende Klasse ein Zeiger ist, wie viele Iteratoren zeigen. Aber das richtig zu implementieren (mit const und rvalue-this) ist nicht ganz einfach.