// types.h
enum Types
{
kType1,
kType2
// ...
};
struct Base {};
// d1.h
class D1 : public Base
{
public:
static const int type = kType1;
// ...
};
// d2.h
class D2 : public Base
{
public:
static const int type = kType2;
// ...
};
struct MyObject {};
#include <map>
// other.cpp
class Foo
{
std::multimap<int, MyObject> mm_;
template<typename T>
void doSomething(MyObject obj)
{
mm_.insert(std::multimap<int, MyObject>::value_type(T::type, obj));
}
public:
void bar() {
MyObject obj;
doSomething<D1>(obj);
doSomething<D2>(obj);
}
};
int main() {
Foo f;
f.bar();
}
Ly8gdHlwZXMuaAplbnVtIFR5cGVzCnsKICAgIGtUeXBlMSwKICAgIGtUeXBlMgogICAgLy8gLi4uCn07CgpzdHJ1Y3QgQmFzZSB7fTsKCi8vIGQxLmgKY2xhc3MgRDEgOiBwdWJsaWMgQmFzZQp7CnB1YmxpYzoKICAgIHN0YXRpYyBjb25zdCBpbnQgdHlwZSA9IGtUeXBlMTsKICAgIC8vIC4uLgp9OwoKLy8gZDIuaApjbGFzcyBEMiA6IHB1YmxpYyBCYXNlCnsKcHVibGljOgogICAgc3RhdGljIGNvbnN0IGludCB0eXBlID0ga1R5cGUyOwogICAgLy8gLi4uCn07CgpzdHJ1Y3QgTXlPYmplY3Qge307CgojaW5jbHVkZSA8bWFwPgovLyBvdGhlci5jcHAKY2xhc3MgRm9vCnsKICAgIHN0ZDo6bXVsdGltYXA8aW50LCBNeU9iamVjdD4gbW1fOwogICAgCiAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgogICAgdm9pZCBkb1NvbWV0aGluZyhNeU9iamVjdCBvYmopCiAgICB7CiAgICAgICAgbW1fLmluc2VydChzdGQ6Om11bHRpbWFwPGludCwgTXlPYmplY3Q+Ojp2YWx1ZV90eXBlKFQ6OnR5cGUsIG9iaikpOwogICAgfQogICAgCnB1YmxpYzoKICAgIHZvaWQgYmFyKCkgewogICAgICBNeU9iamVjdCBvYmo7CiAgICAgIGRvU29tZXRoaW5nPEQxPihvYmopOwogICAgICBkb1NvbWV0aGluZzxEMj4ob2JqKTsKICAgIH0KfTsKCmludCBtYWluKCkgewogICAgRm9vIGY7CiAgICBmLmJhcigpOwp9Cg==