шаблоны — C ++: Использование шаблонной typedef в двух классах

Привет у меня есть следующие классы:

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) в обоих классах?

1

Решение

Поскольку вы объявляете тип указателя на отдельную функцию, в отличие от указателя на функцию-член, вы, конечно, можете поместить 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 вместо.

3

Другие решения

Если вы сделаете это в RandomTreeNode<T> Вы можете сказать тогда:

template<class T>
class RandomTree<T> {
typedef RandomTreeNode<T>::funcion_ptr function_ptr;
};

или использовать RandomTreeNode<T>::funcion_ptr напрямую, что было бы довольно утомительно.

0

Если у вас есть доступ к компилятору (например, 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){/*...*/}
};

В противном случае решение Йоахима Пилеборга является адекватным.

0
По вопросам рекламы [email protected]