Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Дополнить шаблон класса необязятельным списком привязки полей и методов специализирующего шаблон класса к параметрам шаблона #602

Open
AlekTananykin opened this issue Nov 19, 2024 · 0 comments

Comments

@AlekTananykin
Copy link

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;
}

std::string GetStoveModel()
{
	return _model;
}

std::size_t GetServiceLife()
{
	return _serviceLife;
}

...

};

int main()
{
Stove someStove;

//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
...
}

...

};

class Stove
{
public:

std::size_t GetStoveName()
{
	return _serviceLife;
}

...

};

class MyFile
{
public:

std::size_t GetFileName()
{
	return _serviceLife;
}

...

};

int main()
{
Stove someStove;
File someFile;

NetSender<Stove::GetStoveName> stoveNetSender;

companiesGui.Send(someStove); //show stove company

NetSender<File::GetFileName> fileNetSender;
fileNetSender.Send(someFile); //show stove model


...	

return 0;

}

И наконец вариадик

//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:

std::size_t GetStoveName()
{
	return _serviceLife;
}

...

};

class MyFile
{
public:

std::size_t GetFileName()
{
	return _serviceLife;
}

...

};

int main()
{
Stove someStove;
File someFile;

Packer<Stove::GetStoveName, MyFile::GetFileName> packer;

packer.Add(someStove, someFile); 


...	

return 0;

}

Полезные ссылки:

  • https://quick-bench.com/ - онлайн бенчмарк, поможет вам продемонстрировать эффективность вашего подхода
  • https://godbolt.org/ - онлайн дизассемблер
  • https://eel.is/c++draft/ - черновик стандарта C++ с возможностью ссылаться на конкретные параграфы
  • https://wg21.link/ - универсальная ссылка на международные proposal или баги в С++, например https://wg21.link/P1000 ссылается на документ P1000, а https://wg21.link/cwg100 на 100 баг в ядре языка
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant