我一直想弄清楚如何正確地將一個函數與一個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方法就是這樣做的。
如何地圖的ID來一個'的std ::功能'? –
chris