#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()
ofcreate
).4. Я внедрил нечто подобное в C 98. Смотрите github.com/Armin-Montigny/SmlParser/blob/master/include /… . Возможно, это соответствует вашим потребностям.