gpt4 book ai didi

c++ - 如何在数组或 vector 中使用不同的 functoid

转载 作者:行者123 更新时间:2023-11-30 05:44:49 26 4
gpt4 key购买 nike

我编写了一小段代码,可以使用 mem_fun 模板调用封装在 functoid 中的 setter 和 getter 函数。

我现在想在类层次结构之上使用这种方法,其中每个类都可能有 getter 和 setter,它们可以在 vector 或数组中成对注册,以便能够在需要时调用 getter 和 setter。 GUIObject 和 GUICompositeObject 是描述类层次结构之外的示例类。不幸的是,对象的 bound_mem_fun_t 具有不同的类型,这就是我不知道如何将它们集成到仿函数指针的数组/vector 中的原因。

在 C++11 中,我会使用 std::function。有没有办法在 c++98 中模拟这个?

因为我们的编译器只支持c++98,所以我不能使用c++11或c++14的新特性。也不允许提升。

#include <functional>

class GUIObject
{
int m_Alpha;
public:
void SetAlpha(int a) { m_Alpha = a;};
int GetAlpha() {return m_Alpha;};
};


class GUICompositeObject: public GUIObject
{
int m_NumOfChilds;
public:
void SetNumOfChilds(int NumOfChilds) { m_NumOfChilds = NumOfChilds;};
int GetNumOfChilds() {return m_NumOfChilds;};
};

template<typename T>
struct bound_mem_fun_t
{
bound_mem_fun_t(std::mem_fun_t<int, T> GetFunc, std::mem_fun1_t<void, T, int> SetFunc, T* o) :
m_GetFunc(GetFunc), m_SetFunc(SetFunc), obj(o) { } ;
int operator()() { return m_GetFunc(obj); } ;
void operator()(int i) { m_SetFunc(obj, i); } ;
std::mem_fun_t<int, T> m_GetFunc;
std::mem_fun1_t<void, T, int> m_SetFunc;
T* obj;
};


int main()
{
GUIObject kGUIObject;
GUICompositeObject kCompObj;

bound_mem_fun_t<GUIObject> GUIObjectFunc(std::mem_fun(&GUIObject::GetAlpha), std::mem_fun(&GUIObject::SetAlpha), &kGUIObject);
GUIObjectFunc(17);
int ii = GUIObjectFunc();

bound_mem_fun_t<GUICompositeObject> GUICompObjectFunc(std::mem_fun(&GUICompositeObject::GetNumOfChilds), std::mem_fun(&GUICompositeObject::SetNumOfChilds), &kCompObj);
GUICompObjectFunc(17);
int iChilds = GUICompObjectFunc();

return 0;
}

这是@filmors 回答后的完整解决方案:

#include <functional>
#include <vector>
#include <iostream>

class GUIObject
{
int m_Alpha;
public:
void SetAlpha(int a) { m_Alpha = a;};
int GetAlpha() {return m_Alpha;};
};


class GUICompositeObject: public GUIObject
{
int m_NumOfChilds;
public:
void SetNumOfChilds(int NumOfChilds) { m_NumOfChilds = NumOfChilds;};
int GetNumOfChilds() {return m_NumOfChilds;};
};

struct bound_mem_fun_base
{
virtual int operator()() =0;
virtual void operator()(int) =0;
};

template<typename T>
struct bound_mem_fun_t : public bound_mem_fun_base
{
bound_mem_fun_t(std::mem_fun_t<int, T> GetFunc, std::mem_fun1_t<void, T, int> SetFunc, T* o) :
m_GetFunc(GetFunc), m_SetFunc(SetFunc), obj(o) { } ;
virtual int operator()() { return m_GetFunc(obj); } ;
virtual void operator()(int i) { m_SetFunc(obj, i); } ;
std::mem_fun_t<int, T> m_GetFunc;
std::mem_fun1_t<void, T, int> m_SetFunc;
T* obj;
};

template<typename T> bound_mem_fun_t<T>* make_setter(std::mem_fun_t<int, T> GetFunc, std::mem_fun1_t<void, T, int> SetFunc, T* o)
{
return new bound_mem_fun_t<T> (GetFunc, SetFunc, o);
}

int main()
{
GUIObject kGUIObject;
GUICompositeObject kCompObj;

std::vector<bound_mem_fun_base*> kBoundVector;

kBoundVector.push_back(new bound_mem_fun_t<GUIObject> (std::mem_fun(&GUIObject::GetAlpha), std::mem_fun(&GUIObject::SetAlpha), &kGUIObject));
kBoundVector.push_back(new bound_mem_fun_t<GUICompositeObject> (std::mem_fun(&GUICompositeObject::GetNumOfChilds), std::mem_fun(&GUICompositeObject::SetNumOfChilds), &kCompObj));
kBoundVector.push_back(make_setter<GUIObject> (std::mem_fun(&GUIObject::GetAlpha), std::mem_fun(&GUIObject::SetAlpha), &kGUIObject));
kBoundVector.push_back(make_setter<GUICompositeObject> (std::mem_fun(&GUICompositeObject::GetNumOfChilds), std::mem_fun(&GUICompositeObject::SetNumOfChilds), &kCompObj));

for (int i = 0; i < 4 ; i++)
{
(*kBoundVector[i])(i*10);
int res = (*kBoundVector[i])();
std::cout << "Getter result " << res << "\n";
}

return 0;
}

不幸的是,make_setter 函数并没有真正缩短仿函数的创建时间。欢迎任何想法。

最佳答案

只需提供您的 bound_mem_fun_t<T>一个公共(public)基类并使用动态调度来解决您的问题:

struct bound_mem_fun_base {
virtual int operator()() = 0;
virtual void operator()(int) = 0;
};

template <typename T>
struct bound_mem_fun_t : bound_mem_fun_t ...

然后你可以保留指向bound_mem_fun_base的指针在你的 vector 中并将元素称为 (*v[0])() .

此外,TR1 确实包含 std::tr1::function , 可以吗?

关于c++ - 如何在数组或 vector 中使用不同的 functoid,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29619832/

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