Возможны ли условные typedef в С++?

этот вопрос связан с С++

существует библиотека, которая объявляет класс с именем Solver < TS, FS > . Solver является членом другого класса Domain (написанный мной)

теперь существует много доменов, которые имеют член "int region"

то, что я хочу сделать, зависит от значения области, я хочу, чтобы решатель принял разные аргументы для TS и FS. Я думал о чем-то вдоль линии

template<int region>
struct Decider
{
  if(region==1)
  {
     typedef TSA TS;
     typedef FSA FS;
  }
  else
  if(region==2)
  {
     typedef TSB TS;
     typedef FSB FS;
  }
}

а затем используйте его как

Decider<region>::TS
Decider<region>::FS

Однако, из-за объема if, я думаю, что структура бесполезна. Однако я не могу придумать лучшего метода для этого. Любые предложения?

Все разные TS и FS имеют один и тот же интерфейс. Поэтому мне не нужно беспокоиться о внутреннем коде.

Ответ 1

Вы можете специализировать шаблон для любого значения region.

template<int region>
struct Decider;

template<>
struct Decider<1>
{
     typedef TSA TS;
     typedef FSA FS;
};

template<>
struct Decider<2>
{
     typedef TSB TS;
     typedef FSB FS;
};

Ответ 2

Вам нужно использовать специализированную специализацию.

template <int region>
struct Decider;

template <>
struct Decider<1>
{
    typedef TSA TS;
    typedef FSA FS;
};

template <>
struct Decider<2>
{
    typedef TSB TS;
    typedef FSB FS;
};

С++ выберет версию, которая будет использоваться на основе region.

Вы можете, конечно, расширить это, как видите, для других номеров регионов.

Ответ 3

Если вам нужно параметризовать Decider на основе некоторой постоянной времени компиляции, вы можете использовать специализированную специализацию (см. другие ответы).

Если вам нужно параметризовать Decider на основе значения времени выполнения region, вам также необходимо отложить параметризацию во время выполнения. Обычно это делается с помощью какой-либо функции создания или factory idiom.

Ответ 4

Примечание для всех, кто сейчас сталкивается с этим:

Это также можно сделать с помощью библиотек boost, используя type_trait boost:: условный.

typedef boost::conditional<condition, type_if_true, type_if_false> MyTypeDef;

condition все еще должно быть выражением времени компиляции, которое вычисляется как true или false. Это также делает так, что вам не нужно специализировать весь ваш класс для нескольких строк различий.