Потребность в такой возможности появлялась при написании разных обработчиков объектов,
которые обрабатывали одним и тем же алгоритмом разные параметры одного и того же объекта.
Недавно снова была необходимость в такой возможности в GUI отображения товаров. При этом у одних и тех же товаров
нужно было выводить разные характеристики.
Ниже привожу набросок кода, как бы я хотел это сделать, если бы была возможность привязывать методы и поля специализирующего шаблон класса.
include
include
//declare template and add binding to methods and fields
tamplate <class {T::ShowValue, T::RightColumnValue}>
class GoonessGui
{
public:
void Show(T item)
{
...
ShowItem(item.ShowValue());
RightColumnValueShow(item.RightColumnValue());
//ShowItem and RightColumnValueShow are internal methods
...
}
...
};
class Stove
{
public:
std::string GetStoveCompany()
{
return _name;
}
//use template binding list
GoonessGui<Stove::GetStoveCompany, Stove::GetServiceLife> companiesGui();
companiesGui.Show(someStove); //show stove company
GoonessGui<Stove::GetStoveModel, Stove::GetServiceLife> modelsGui();
modelsGui.Show(someStove); //show stove model
//Do not use template binding list
std::list<Stove> stoveList;//This template forrm is correct too
...
return 0;
}
Важно чтобы сигнатуры методов и полей пареметров шаблона совпадали с соответствующими сигнатурами специализирующих
классов.
Кроме того, такая возможность может возникнуть, если неожиданно возникла необходимость
обрабатывать одинаковым образом объекты совершенно разных и несвязанных друг с другом классов.
include
//declare template and add binding to methods and fields
tamplate <class {T::ShowValue}>
class NetSender
{
public:
void Send(T item)
{
...
SendItem(item.ShowValue());
//SendItem is an internal method
...
}
Template binding list
Потребность в такой возможности появлялась при написании разных обработчиков объектов, которые обрабатывали одним и тем же алгоритмом разные параметры одного и того же объекта.
Недавно снова была необходимость в такой возможности в GUI отображения товаров. При этом у одних и тех же товаров нужно было выводить разные характеристики.
Ниже привожу набросок кода, как бы я хотел это сделать, если бы была возможность привязывать методы и поля специализирующего шаблон класса.
include
include
//declare template and add binding to methods and fields tamplate <class {T::ShowValue, T::RightColumnValue}> class GoonessGui { public: void Show(T item) { ... ShowItem(item.ShowValue()); RightColumnValueShow(item.RightColumnValue()); //ShowItem and RightColumnValueShow are internal methods ... }
};
class Stove { public: std::string GetStoveCompany() { return _name; }
};
int main() { Stove someStove;
}
Важно чтобы сигнатуры методов и полей пареметров шаблона совпадали с соответствующими сигнатурами специализирующих классов.
Кроме того, такая возможность может возникнуть, если неожиданно возникла необходимость обрабатывать одинаковым образом объекты совершенно разных и несвязанных друг с другом классов.
include
//declare template and add binding to methods and fields tamplate <class {T::ShowValue}> class NetSender { public: void Send(T item) { ... SendItem(item.ShowValue()); //SendItem is an internal method ... }
};
class Stove { public:
};
class MyFile { public:
};
int main() { Stove someStove; File someFile;
}
И наконец вариадик
//Variadic example
include
//declare template and add binding to methods and fields tamplate <class ...{T::ShowValue}> class Packer { public: void Add(T ... item) { ...
};
class Stove { public:
};
class MyFile { public:
};
int main() { Stove someStove; File someFile;
}
Полезные ссылки: