Boost лямбда-пример

У меня есть карта, созданная как часть решения

enum Opcode {
OpFoo,
OpBar,
OpQux,
};

// this should be a pure virtual ("abstract") base class
class Operation {
// ...
};

class OperationFoo: public Operation {
// this should be a non-abstract derived class
};

class OperationBar: public Operation {
// this should be a non-abstract derived class too
};

std::unordered_map<Opcode, std::function<Operation *()>> factory {
{ OpFoo, []() { return new OperationFoo; } }
{ OpBar, []() { return new OperationBar; } }
{ OpQux, []() { return new OperationQux; } }
};

Opcode opc = ... // whatever
Operation *objectOfDynamicClass = factory[opc]();

Но, к сожалению, мой компилятор gcc-4.4.2 не поддерживает лямбда-функции.

Я хотел бы альтернативную (читабельную) реализацию для этого с использованием библиотеки Boost. (Лямбда / феникс)

Есть ли какой-нибудь способ проникнуть в C ++ std:; lambdas и std :: functions в мой компилятор -std = C ++ 0x, такие опции не работают … 🙁

PS: пожалуйста, предоставьте удобочитаемое решение

2

Решение

Вы можете использовать Феникс new_:

std::unordered_map<Opcode, std::function<Operation*()>> factory {
{ OpFoo, boost::phoenix::new_<OperationFoo>() },
{ OpBar, boost::phoenix::new_<OperationBar>() },
//{ OpQux, []() { return new OperationQux; } },
};

Жить на Колиру

#include <boost/phoenix.hpp>
#include <unordered_map>
#include <functional>

enum Opcode {
OpFoo,
OpBar,
OpQux,
};

namespace std
{
template<> struct hash<Opcode> : std::hash<int>{};
}// this should be a pure virtual ("abstract") base class
class Operation {
// ...
};

class OperationFoo: public Operation {
// this should be a non-abstract derived class
};

class OperationBar: public Operation {
// this should be a non-abstract derived class too
};

std::unordered_map<Opcode, std::function<Operation*()>> factory {
{ OpFoo, boost::phoenix::new_<OperationFoo>() },
{ OpBar, boost::phoenix::new_<OperationBar>() },
//{ OpQux, []() { return new OperationQux; } },
};

int main() {
Opcode opc = OpFoo;
Operation *objectOfDynamicClass = factory[opc]();

delete objectOfDynamicClass;
}
1

Другие решения


По вопросам рекламы [email protected]