Использование шаблонов для определения типа в C ++? - PullRequest
0 голосов
/ 30 октября 2011

Я хочу иметь возможность объявлять тип класса в зависимости от использования. Например, возьмем трехэтапный конвейер, который имеет 3 очереди, соединяющие их вместе. Я хочу убедиться, что я правильно соединяю ступени с очередями (например: очереди идут в правильном направлении, в правильные единицы и т. Д.)

Вот чрезвычайно упрощенный пример того, что я пытаюсь выполнить:

template<class in, class out>
class Fifo: public queue{};

class Stage1; class Stage2; class Stage3;

class Stage1{
    Fifo<Stage1,Stage2>* m_fifoOut;
};

class Stage2{
    Fifo<Stage1,Stage2>* m_fifoIn;
    Fifo<Stage2,Stage3>* m_fifoOut;
};

class Stage3{
    Fifo<Stage2,Stage3>* m_fifoIn;
};

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

Ответы [ 3 ]

2 голосов
/ 30 октября 2011

Думаю, я бы попытался представить конвейер немного более напрямую.В частности, я бы попытался сосредоточиться на этапах конвейера, а не на FIFO.Если у вас есть доступный C ++ 11, одной из возможностей будет шаблон с переменным числом, в котором вы указываете типы этапов конвейера, и он автоматически генерирует FIFO между каждым этапом конвейера и следующим.

1 голос
/ 30 октября 2011

Я хочу убедиться, что я правильно соединяю ступени с очередями (например: очереди идут в правильном направлении, к нужным единицам и т. Д.)

Просто имейте мета-функцию, которая генерирует второй тип, и просто укажите первый тип.

template<class In>
struct get_target;

class Stage1; class Stage2; class Stage3;

template<>
struct get_target<Stage1>{
  typedef Stage2 type;
};

template<>
struct get_target<Stage2>{
  typedef Stage3 type;
};

template<class In>
class Fifo : public queue{
  typedef In in_type;
  typedef typename get_target<In>::type out_type;
};

struct Stage1{
  Fifo<Stage1> m_fifoOut;
};

struct Stage2{
  Fifo<Stage1> m_fifoIn;
  Fifo<Stage2> m_fifoOut;
};

struct Stage1{
  Fifo<Stage2> m_fifoIn;
};
0 голосов
/ 30 октября 2011

Это выглядит вполне разумно, насколько это возможно.Я могу заверить вас, что в компании, в которой я работаю, мы регулярно делаем намного более дикие вещи с шаблонами, чем это (вы не хотели бы знать), и никогда не возникало проблем, связанных с дублированием объектного кода (я полагаю, что выдумаем о).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...