Возможны ли условные 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. Это также делает так, что вам не нужно специализировать весь ваш класс для нескольких строк различий.