gpt4 book ai didi

c++ - 如何在 C++ 中为多个类实现公共(public)仿函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:37:19 25 4
gpt4 key购买 nike

假设您有两个(或更多)具有私有(private)成员 vector 的类:

class A {  
private:
std::vector<X> priv_vec;
public:
//more stuff
}

class B {
private:
std::vector<Y> priv_vec;
public:
//more stuff
}

你有一个仿函数类,它有一个状态并在一个通用 vector 上工作(对元素进行排序或计数或类似的东西)。仿函数的状态由仿函数正在处理的第一个 vector 初始化。如果稍后将仿函数应用于另一个 vector ,它将根据状态改变其行为(以相同的方式排序或在与第一个元素一样多的元素之后修剪第二个 vector ,等等)

在不将私有(private) vector 暴露给其他类或类的用户的情况下,实现此类仿函数(设计模式或功能接口(interface)?)的最佳方法是什么?

例如:用户想用 A 类的对象初始化这个仿函数,然后将这个初始化的仿函数用于 B 类的一个或多个对象。用户不能(也不应该)将私有(private) vector 直接用作函数- 仿函数的参数。

最佳答案

嗯,首先,要注意仿函数中的状态。

算法的大多数 STL 实现可能会复制仿函数,因此您通常必须在外部结构中提取状态。

现在,对于仿函数的应用,很简单:让您的类声明一个模板成员函数!

class A
{
public:
template <class Functor>
Functor Apply(Functor f);

private:
};

class B
{
public:
template <class Functor>
Functor Apply(Functor f);
};

// Usage
MyFunctor f;
A a;
B b;
b.Apply(a.Apply(f));

至于仿函数,如果你需要状态:

// Alternative 1
class FunctorState {};

class Functor
{
public:
Functor(FunctorState& state): m_state(state) {}

// some operator()(...)

private:
FunctorState& m_state;
};

// Alternative 2
class Functor
{
struct FunctorState {};
public:
Functor(): m_state(new FunctorState) {}

// some operator()(...)

private:
boost::shared_ptr<FunctorState> m_state;
};

这样,Functor 的拷贝都指向同一个 FunctorState 实例。只需根据您是否希望实际从类外访问状态来选择。

关于c++ - 如何在 C++ 中为多个类实现公共(public)仿函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1642240/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com