powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / [С++11] Пример на Variadic templates
4 сообщений из 4, страница 1 из 1
[С++11] Пример на Variadic templates
    #39525904
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Простой пример, демонстрирующий variadic templates а также delegating constructors .

Variadics используются в функциях-членах класса, а также в конструкторе.


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
//#include "targetver.h"
#include <iostream>
#include <string>
#include <vector>
#include <stdexcept>

struct V
{
	V() {}
	V(const std::string &pn, int pv) : param_name(pn), param_value(pv) {}

	std::string param_name;
	int param_value;
};


struct VList
{
	VList() {}
	VList(const std::string &pn, int pv) { _vlist.push_back( V(pn, pv) );  }

	template<typename S, typename T, typename... Args>
	VList(const S& name, const T& value, const Args&... args) : VList(args...)
	{
		_vlist.push_back( V(std::string(name), int(value)) );
	}


	template<typename S, typename T>
	static void construct(VList& vlist, const S& name, const T& value)
	{
		vlist._vlist.push_back(V(std::string(name), int(value)));
	}

	template<typename S, typename T, typename... Args>
	static void construct(VList& vlist, const S& name, const T& value, const Args&... args)
	{
		vlist._vlist.push_back( V(std::string(name), int(value)) );
		
		VList::construct(vlist, args...);
	}

	template<typename... Args>
	static VList make(const Args&... args)
	{
		VList vlist;
		construct(vlist, args...);
		return vlist;
	}

	unsigned n_values() const { return _vlist.size(); }
	const V& named_value(unsigned n) const { return _vlist[n]; }
	const std::string& name(unsigned n) const { return _vlist[n].param_name; }
	const int& value( unsigned n ) const { return _vlist[n].param_value; }
	const int& value( const std::string& name) const
	{ 
		for (const auto& nv : _vlist)
		{
			if (nv.param_name == name)
				return nv.param_value;
		}
		throw std::out_of_range(std::string("no value with name \"") + name +"\"");
	}

private:
	std::vector<V> _vlist;
};



int main()
{
	{
		VList vl;
		VList::construct(vl, "one", 1, "two", 2, "three", 3, "The Ultimate Answer", 42);
	}

	{
		VList vl = VList::make("one", 1, "two", 2, "three", 3, "The Ultimate Answer", 42);
	}

	VList vl("one", 1, "two", 2, "three", 3, "The Ultimate Answer", 42);

	std::cout << "VList is:\nBEGIN" << std::endl;
	for (unsigned i = 0; i < vl.n_values(); ++i)
	{
		std::cout << vl.name(i) << " = " << vl.value(i) << std::endl;
	}
	std::cout << "END" << std::endl;
	return 0;
}




Удачи в освоении.

----
Читал хинты оракла. Много думал...
...
Рейтинг: 0 / 0
[С++11] Пример на Variadic templates
    #39526052
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот мой пример для variadics , конструкция содержит вектора нескольких типов, функция добавления элемента подставляется компилятором по типу добавляемого аргумента.
...
Рейтинг: 0 / 0
[С++11] Пример на Variadic templates
    #39526066
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторfor (const auto nv : _vlist)
тут копия не будет делаться? почему бы не брать ссылку на элемент?
...
Рейтинг: 0 / 0
[С++11] Пример на Variadic templates
    #39526543
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex_kавторfor (const auto nv : _vlist)
тут копия не будет делаться? почему бы не брать ссылку на элемент?

Ну, будет -- и фиг с ней...
(исправил, спасибо)
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / [С++11] Пример на Variadic templates
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]