1

嗨,我有以下课程:

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)在两个类中定义?

4

3 回答 3

3

当您声明一个独立的函数指针类型时,与成员函数指针相反,您当然可以将 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改用。

于 2012-10-17T11:18:45.017 回答
0

如果您将其公开,RandomTreeNode<T>则可以说:

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

或者RandomTreeNode<T>::funcion_ptr直接使用,比较繁琐。

于 2012-10-17T11:22:13.610 回答
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){/*...*/}
};

否则,Joachim Pileborg 的解决方案就足够了。

于 2012-10-17T11:24:50.817 回答