我一直在试图弄清楚如何正确地将函数与 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++ 中的仿函数来实现相同的功能。我想我需要使用继承才能将不同的函数存储在同一个数组中,这意味着我还需要对数组使用指针以防止切片。以下方法是正确的方法吗?还有其他选择吗?
还有比我如何调用操作员更简单的版本吗?
#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 方式是这样做的方式。