2014-11-04 2 views
2

У меня есть карта, созданный как часть решенияподталкивания пример лямбда

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 не поддерживает лямбда-функции.

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

Есть ли способ SNEEK в C++ зЬй:;. Лямбды и СТД :: функции в мой компилятор -std = C++ 0x, варианты, как это не удается ... :(

PS: Просьба читаемым Раствора

ответ

1

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

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

Live On Coliru

#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; 
} 
Смежные вопросы