はい、これはさまざまな方法で実行できます。ここに2つの一般的な可能性があります。
古いスタイルの関数ポインタ
class mytree
{
// typedef for a function pointer to act
typedef void (*node_fn_ptr)(tree_node&);
void in_order(node_fn_ptr)
{
tree_node* pNode;
while (/* ... */)
{
// traverse...
// ... lots of code
// found node!
(*fnptr)(*pNode);
// equivalently: fnptr(*pNode)
}
}
};
void MyFunc(tree_node& tn)
{
// ...
}
void sample(mytree& tree)
{
// called with a default constructed function:
tree.inorder(&MyFunc);
// equivalently: tree.inorder(MyFunc);
}
ファンクターの使用
テンプレートメンバーを使用して、関数ポインターを操作します
class mytree
{
// typedef for a function pointer to act
typedef void (*node_fn_ptr)(tree_node&);
template<class F>
void in_order(F f)
{
tree_node* pNode;
while (/* ... */)
{
// traverse...
// ... lots of code
// found node!
f(*pNode);
}
}
};
struct ExampleFunctor
{
void operator()(tree_node& node)
{
// do something with node
}
}
void sample(mytree& tree)
{
// called with a default constructed function:
tree.inorder(ExampleFunctor());
}