 <p>You can use template arguments to program against 'general' enum types. Much like this:</p> <pre><code>// enum.h struct MyClass1 { enum e { cE1, cE2, cELast }; }; // algo.h // precondition: tEnum contains enumerate type e template&lt; typename tEnum &gt; typename tEnum::e get_second() { return static_cast&lt;typename tEnum::e&gt;(1); } // myclass1.h // myclass.h template&lt; typename tClass1 &gt; class MyClass2 { tClass1 * ptr; void func( tClass1::e e ); }; // main.cpp #include "enum.h" #include "algo.h" int main(){ return get_second&lt;Enum&gt;(); } </code></pre>