аргументы ctor типа шаблона во время создания - PullRequest
1 голос
/ 11 апреля 2010
template <typename T>
class A
{
public:
   T t;
   void Do (void)
   {
      t.doSomething();
   }
};

В приведенном выше, как я могу предоставить параметры конструктору 't' во время создания шаблона?.

Как, если бы у меня было:

class P1
{
public:
    P1 (int i, int a) {}
};

class P2
{
public:
    P2 (int a) {}
};

Я хотел бы использовать P1 и P2 в качестве параметров шаблона для A .. В настоящее время я поставляю экземпляр P1 / P2 в ctor of A, откуда 't' инициализируется с использованием copy-ctor.

Большая картинка (для UncleBens, GMan):

У меня есть много структур данных (DS) с множеством извергов в нем. Каждый из этих DS хранится в базе данных, отображается в интерфейсе пользователя и передается через RPC. У меня есть класс для проверки каждого из этих DS. Класс валидации должен вести себя по-разному в зависимости от ситуации, в которой он проверяется. Если проверка данных, извлеченных из БД, не удалась, она должна записать «понятную разработчику» ошибку и умереть с утверждением. При сбое проверки данных, полученных от rpc-клиента, сервер должен ответить соответствующей ошибкой. При сбое проверки данных, полученных с rpc-сервера, они должны быть зарегистрированы, и клиент должен аварийно завершить работу. При сбое проверки в пользовательском интерфейсе пользователь должен быть уведомлен.

Я решил сделать «обработку ошибок» политикой, которую можно выбрать во время компиляции в качестве параметра шаблона. Однако каждый из этих механизмов обработки ошибок требует разных способов построения. И вот где я застрял.

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

Я хочу знать, как другие люди решат такой случай.

Ответы [ 2 ]

2 голосов
/ 11 апреля 2010
template <typename T>
class A
{
public:
   T t;
   void Do (void)
   {
      t.doSomething();
   }
   A() : t(parameters) {};  //Like this
}

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

0 голосов
/ 11 апреля 2010
template <typename T, int i, int a>
class A
{
public:
   T t;
   A() : t(i, a)
   {
   }
   void Do (void)
   {
      t.doSomething();
   }
}

A<MyT, 5, 8> a;

Конечно, это работает для фиксированного числа аргументов.


Edit:
Без C ++ 0x вам, возможно, потребуется предоставить несколько шаблонов для разного количества аргументов.


Edit:
Если ваш тип не всегда int, вы можете пойти по этому пути:

template <typename T, typename ARG1, ARG VAL1>
class A
{
    T t;

  public:
    A() : t(VAL1)
    {
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...