gpt4 book ai didi

c++ - 静态全局数组中的仿函数

转载 作者:搜寻专家 更新时间:2023-10-31 00:15:48 27 4
gpt4 key购买 nike

我一直在努力弄清楚如何正确地将函数与 id 配对。到目前为止,我一直在做的是 C 方式:

#include <iostream>

void PrintA();
void PrintB();

struct Function
{
int id;
void (*function)();
};

static const Function functions[] =
{
{1, PrintA},
{2, PrintB},
{0, 0}
};

void PrintA()
{
std::cout << "A" << std::endl;
};

void PrintB()
{
std::cout << "B" << std::endl;
};

int main()
{
int id = 1;

for(int i = 0; functions[i].function != 0 ; i++)
{
if(functions[i].id == id)
{
functions[i].function();
}
}
}

我正在尝试使用 C++ 中的仿函数实现相同的功能。我想我需要使用继承才能将不同的函数存储在同一个数组中,这意味着我还需要为数组使用指针以防止切片。以下方法是否正确,还有其他选择吗?

还有比我做的更简单的调用运算符(operator)的版本吗?

#include <iostream>
#include <memory>

class Base
{
public:
virtual void operator()() = 0;
};

class PrintA : public Base
{
public:
void operator()();
};

void PrintA::operator()()
{
std::cout << "A" << std::endl;
}

class PrintB : public Base
{
public:
void operator()();
};

void PrintB::operator()()
{
std::cout << "B" << std::endl;
}

struct Functor
{
int id;
std::shared_ptr<Base> function;
};

static Functor functors[] =
{
{1, std::shared_ptr<Base>(new PrintA)},
{2, std::shared_ptr<Base>(new PrintB)},
{0, 0}
};

int main()
{
int id = 2;

for(int i = 0; functors[i].function != 0 ; i++)
{
if(functors[i].id == id)
{
functors[i].function->operator()();
}
}
}

编辑:我必须使用相当旧的 GCC 版本,因此无法使用 c++11 功能。不过,Boost 是可用的。我想 std::map 是个好主意,但我真正想问的(并没有真正说清楚)是有没有比 shared_ptr 更好的存储函数的方法。我想 std::function/boost::function 方式就是这样做的方式。

最佳答案

在 C++11(或 Boost,如果你还停留在过去)中,这种类型删除function 包装器中可用;并且总是有 map 来执行基于 ID 的查找。所以你的例子很简单:

#include <map>
#include <functional>
#include <iostream>

// Note: This will be a lot messier if you're stuck with a pre-2011 compiler.
// You'll need to define the functors (or functions) separately, and either
// initialise the map with the result of a function call (possibly using
// Boost.Assign), or write some code somewhere else to populate it.
//
// Or use an array, with lookup code like your C implementation.
std::map<int, std::function<void()>> functors {
{1, [](){std::cout << "A" << std::endl;}},
{2, [](){std::cout << "B" << std::endl;}}
};

int main() {
functors[2]();
}

如评论中所述,如果实际情况像示例一样简单,您可以使用函数指针而不是 function(并且仍然使用 lambda 初始化它,如果您像)和一个数组(由 id 索引)而不是一个映射。我的示例假设您需要一个更通用的解决方案,将任意值映射到任意仿函数。

关于c++ - 静态全局数组中的仿函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18465374/

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