aboutsummaryrefslogtreecommitdiffstats
path: root/deps/sol2/examples/source/variadic_args.cpp
blob: 2d9e5577c09740fdabeb71d8ed6ebee7ddf5719a (plain)
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
#define SOL_ALL_SAFETIES_ON 1
#include <sol/sol.hpp>

#include <iostream>

int main() {
	std::cout << "=== variadic_args ===" << std::endl;

	sol::state lua;
	lua.open_libraries(sol::lib::base);

	// Function requires 2 arguments
	// rest can be variadic, but:
	// va will include everything after "a" argument,
	// which means "b" will be part of the varaidic_args list too
	// at position 0
	lua.set_function("v", [](int a, sol::variadic_args va, int /*b*/) {
		int r = 0;
		for (auto v : va) {
			int value = v; // get argument out (implicit conversion)
						// can also do int v = v.as<int>();
						// can also do int v = va.get<int>(i); with index i
			r += value;
		}
		// Only have to add a, b was included from variadic_args and beyond
		return r + a;
	});

	lua.script("x = v(25, 25)");
	lua.script("x2 = v(25, 25, 100, 50, 250, 150)");
	lua.script("x3 = v(1, 2, 3, 4, 5, 6)");
	// will error: not enough arguments
	//lua.script("x4 = v(1)");

	lua.script("assert(x == 50)");
	lua.script("assert(x2 == 600)");
	lua.script("assert(x3 == 21)");
	lua.script("print(x)"); // 50
	lua.script("print(x2)"); // 600
	lua.script("print(x3)"); // 21

	std::cout << std::endl;

	return 0;
}