変数xの値によって、生成するクラステンプレートの型を変えたい場合にスマートな方法はないでしょうか。

template <typename T>
class C
{
 T value; // 実際にはもっと複雑なクラス
};

enum gen_t { i, d, c };

void f(gen_t type)
{
 switch(type) {
 case i:
  {
   C<int> c;
   g(c); // g()は関数テンプレート
   // ...
  }
  break;
 case d:
  {
   C<double> c;
   g(c);
   // ...

このようにswitch-caseで分岐するしか思いつきません。