Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / [С++11] Пример на Variadic templates / 4 сообщений из 4, страница 1 из 1
25.09.2017, 16:44
    #39525904
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[С++11] Пример на Variadic templates
Простой пример, демонстрирующий 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
26.09.2017, 05:23
    #39526052
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[С++11] Пример на Variadic templates
Вот мой пример для variadics , конструкция содержит вектора нескольких типов, функция добавления элемента подставляется компилятором по типу добавляемого аргумента.
...
Рейтинг: 0 / 0
26.09.2017, 07:39
    #39526066
alex_k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[С++11] Пример на Variadic templates
авторfor (const auto nv : _vlist)
тут копия не будет делаться? почему бы не брать ссылку на элемент?
...
Рейтинг: 0 / 0
26.09.2017, 15:42
    #39526543
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[С++11] Пример на Variadic templates
alex_kавторfor (const auto nv : _vlist)
тут копия не будет делаться? почему бы не брать ссылку на элемент?

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


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