Возможны ли условные определения типов в C ++? - PullRequest
10 голосов
/ 14 июня 2011

этот вопрос относится к с ++

есть библиотека, которая объявляет класс с именем Solver . Солвер является членом другого класса Домена (написано мной)

сейчас есть много доменов, которые имеют члена "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 имеют одинаковый интерфейс. Так что мне не нужно беспокоиться о внутреннем коде.

Ответы [ 4 ]

16 голосов
/ 14 июня 2011

Вы можете специализировать шаблон для любого значения 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;
};
9 голосов
/ 14 июня 2011

Вам необходимо использовать специализацию шаблонов.

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;
};

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

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

5 голосов
/ 14 июня 2011

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

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

2 голосов
/ 31 мая 2013

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

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

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

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

...