Привет у меня есть следующие классы:
template<class T>
class RandomTree<T> {
private:
RandomTreeNode root;
typedef double (*funcion_ptr) (T, T);
public:
RandomTree(std::vector<function_ptr> functions){...}
};
template<class T>
class RandomTreeNode<T> {
private:
typedef double (*funcion_ptr) (T, T);
function_ptr function;
public:
RandomTreeNode(function_ptr function){...}
};
Дерево задается вектором указателей на функции, и каждый узел создается и имеет одну конкретную функцию. Есть ли способ для меня, чтобы не определять typedef double (*function_ptr) (T,T)
в обоих классах?
Поскольку вы объявляете тип указателя на отдельную функцию, в отличие от указателя на функцию-член, вы, конечно, можете поместить typedef в отдельный шаблонный класс в глобальной области видимости или в пространство имен, чтобы к нему могли обращаться оба класса.
Как это:
template<class T>
struct RandomTreeFunction
{
typedef double (*function_ptr)(T, T);
};
template<class T>
class RandomTree<T> {
private:
typedef typename RandomTreeFunction<T>::function_ptr function_ptr;
...
};
Я также рекомендую вам изучить использование std::function
вместо.
Если вы сделаете это в RandomTreeNode<T>
Вы можете сказать тогда:
template<class T>
class RandomTree<T> {
typedef RandomTreeNode<T>::funcion_ptr function_ptr;
};
или использовать RandomTreeNode<T>::funcion_ptr
напрямую, что было бы довольно утомительно.
Если у вас есть доступ к компилятору (например, gcc> = 4.7, clang> = 3.0), который поддерживает псевдонимы шаблона, вы можете сделать что-то вроде
#include <vector>
template<class T>
using function_ptr = double (*)(T,T);
template<class T>
class RandomTreeNode {
private:
function_ptr<T> function;
public:
RandomTreeNode(function_ptr<T> function){/*...*/}
};
template<class T>
class RandomTree {
private:
RandomTreeNode<T> root;
public:
RandomTree(std::vector<function_ptr<T>> functions){/*...*/}
};
В противном случае решение Йоахима Пилеборга является адекватным.