Comments 3
Но в каком порядке были бы сохранены элементы зависело бы от компилятора.

В таком виде — да. Но можно использовать то, что инициализация аргументов для initializer_list'а выполняется в строго определённом порядке, и получается такой вот трюк:


template<typename... Args>
void foo(Args... args)
{
    std::initializer_list<int> unused { (static_cast<void>(f(args)), 0)... };
    (void) unused;
}

Первое приведение к void здесь нужно на (наркоманский и не встречающийся в реальности, но всё же) случай, когда f(args) возвращает что-то с переопределённым оператором запятая.

Как-то давно мечтал об идеальной функции send, суть которой была в том, что она могла принять любой аргумент и в разном количестве аргументов отправить его серверу, а тот обработать.

Получилось так:
// Код сервера
#include <socket.hpp>

void Foo(const char *txt, int i)
{
	printf("%s %d\n", txt, i);
}

int main()
{
	snl::server server;
	server["Foo"] = Foo;

	server.create("127.0.0.1", 9999, snl::arch_server_t::tcp_thread);
	server.run(snl::type_blocked_t::non_block);


	system("pause");
        return 0;
}


// Код клиента
#include <socket.hpp>

int main()
{
	snl::client client;
	client.connect("127.0.0.1", 9999, snl::arch_server_t::tcp_thread);
	client.run(snl::type_blocked_t::non_block);

	for (int i = 0;; i++)
		client.send("Foo", "Test", i);

        return 0;
}


Как видно:
 client.send("Foo", "Test", i); 

Первым аргументом выходит строка, она же имя функции, которая будет вызвана.
Получилась задача, требуется лист функции, где каждая функция имеет рандомное количество аргументов, отличающихся по типу, в добавок функцию еще нужно найти в этом листе и вызвать, передав аргументы. Такая задача для меня была сложная и вот думаю, где же была ваша статья раньше :D
Only those users with full accounts are able to leave comments. Log in, please.