#c #templates #types #overloading #variadic-templates
#c #шаблоны #типы #перегрузка #variadic-шаблоны
Вопрос:
Я хотел бы иметь перегрузку функций для каждого типа класса шаблонов variadic. Возможно ли это?
template<typename ...args>
class Example {
virtual void doSomething(args(0) arg) { ... }
virtual void doSomething(args(1) arg) { ... }
/// etc... implementations are the same, but I need access to the type
}
Я пытался использовать выражения fold, но я почти уверен, что я не на правильном пути. Поскольку мне нужно, чтобы функции были виртуальными, я не могу объявить их как template<typename T> virtual void doSomething(T arg)
потому что, ну, виртуальные функции шаблона не разрешены.
Комментарии:
1. Но идея шаблона заключается в том, чтобы позволить пользователю решать, с каким типом он будет создавать экземпляр класса, поэтому на момент написания шаблона variadic вы не знаете, сколько аргументов там будет. Как вы узнаете, сколько перегрузок вам придется обеспечить во время написания кода? Если реализации одинаковы, вы не должны делать его шаблоном variadic. Подойдет обычная
template<typename T>
и единственная функцияvirtual void doSomething(T arg) { ... }
, учитывая, что реализация идентична.2. Не могли бы вы привести нам более подробный пример того, чего вы пытаетесь достичь, пожалуйста? Образец
Example
иерархии, псевдокод внутреннего содержимогоdoSomething
и вариант использования с использованием иерархии.3. Привет. Удовлетворяет ли мой ответ вашему вопросу? Если да, пожалуйста, примите это. Если нет, пожалуйста, скажите мне (в соответствии с этим ответом, конечно), что еще вы ожидаете от решения, которого мне не хватает.
Ответ №1:
Вы можете получить класс из шаблонного пакета экземпляров шаблона базового класса, который определяет одну виртуальную функцию с ее единственным параметром шаблона в качестве типа параметра функции. Затем производный класс сохраняет перегрузки функций для каждого типа аргумента шаблона, которые все являются виртуальными.
template<typename arg>
class Base {
virtual void doSomething(arg arg) {}
};
template<typename ...args>
class Example : public Base<args>... {};