Абстрактная фабрика с необязательным аргументом ctor без шаблонов переменных

#c #template-meta-programming

#c #шаблон-метапрограммирование

Вопрос:

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

 template <class IFTYPE, typename IDTYPE=std::string, typename Args=void >
class AbstractFactory {
  typdef std::shared_ptr<IFTYPE> (*CreateFunc)(Args);
  public:
  std::shared_ptr<IFTYPE> create( IDTYPE id, Args args ) { 
    return nullptr;
  }
};
  

Проблема в том, что я не могу обработать тип по умолчанию в create методе для void . Поскольку я не могу назвать аргумент void .

Как я могу обойти это, сохранив опцию для разных типов аргументов? Частичная специализация не должна работать, поскольку это изменило бы сигнатуру create . Какие варианты у меня здесь есть?

Спасибо…

Комментарии:

1. Рассматриваете ли вы вариант упаковки аргументов в кортеж (boost:: tuple должен работать, я полагаю). Чтобы пустой набор аргументов стал boost:tuple<> , который допустим для перегрузки.

2. Я не понимаю, что вы имеете в виду, говоря «Частичная специализация не должна работать, поскольку это изменило бы сигнатуру create «. Каждое другое Args изменяет подпись create() . Точно, какую подпись для crate() вы хотите в void случае?

3. Не совсем понятно, что вы собираетесь здесь делать, например, почему вы не можете частично специализироваться? Добавьте пример того, как вы собираетесь использовать AbstractFactory ! Если вам действительно это необходимо create(IDTYPE, Args) , подумайте о создании class DummyArgs , которое просто имеет конструктор по умолчанию, но ничего не делает (и по умолчанию использует аргумент Args args=Args() of create ).

4. Я внедрил нечто подобное в C 98. Смотрите github.com/Armin-Montigny/SmlParser/blob/master/include /… . Возможно, это соответствует вашим потребностям.