It seems to me, the copyX() functions follow the same procedure. Cannot it be generalized to the following?
```c++
template <typename E>
MeshLib::Element* copyElement( ... )
{
    MeshLib::Node** new nodes = new MeshLib::Node*[org_elem -> getNNodes())];
    for (std::size_t i = 0; i < org_elem->getNNodes(); ++i)
        new_nodes[i] = nodes[org_elem ... getID()];
    return new E(new_nodes, org_elem->getValue());
}
```

Disclaimer: I didn't test it