You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Потребность в такой возможности появлялась при написании разных обработчиков объектов,
которые обрабатывали одним и тем же алгоритмом разные параметры одного и того же объекта.
Недавно снова была необходимость в такой возможности в 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;
}
Полезные ссылки:
The text was updated successfully, but these errors were encountered: