LINUX.ORG.RU

История изменений

Исправление pavlick, (текущая версия) :

ЦПП сила )

#include <array>
#include <string>
#include <iostream>
#include <tuple>

struct Foo
{
 std::string s;
 size_t b,e;
};

template<std::size_t sz>
auto Baz(std::array<Foo, sz> args)
{
	std::cout << "cnt = " <<  args.size() << std::endl;
	for (auto &a : args)
		std::cout << a.s << std::endl;
	return 0;
}

consteval int args_cnt(const char *str)
{
	int ret = 0;
	for (;  *str != '\0';  ++ str)
		if (*str == '}')
			++ ret;
	return ret;
}

#define call_baz(first, ...) \
Baz(std::array<Foo, args_cnt(#__VA_ARGS__)>{ Foo first __VA_OPT__(,) __VA_ARGS__})

int main()
{
	call_baz( {"first", 4, 2}, {"second", 6, 2}, {"third", 6, 2} );
	return 0;
}

Исправление pavlick, :

ЦПП сила )

#include <array>
#include <string>
#include <iostream>
#include <optional>
#include <tuple>

struct Foo
{
 std::string s;
 size_t b,e;
};

template<std::size_t sz>
auto Baz(std::array<Foo, sz> args)
{
	std::cout << "cnt = " <<  args.size() << std::endl;
	for (auto &a : args)
		std::cout << a.s << std::endl;
	return 0;
}

consteval int args_cnt(const char *str)
{
	int ret = 0;
	for (;  *str != '\0';  ++ str)
		if (*str == '}')
			++ ret;
	return ret;
}

#define call_baz(first, ...) \
Baz(std::array<Foo, args_cnt(#__VA_ARGS__)>{ Foo first __VA_OPT__(,) __VA_ARGS__})

int main()
{
	call_baz( {"first", 4, 2}, {"second", 6, 2}, {"third", 6, 2} );
	return 0;
}

Исходная версия pavlick, :

ЦПП сила )

#include <array>
#include <string>
#include <iostream>
#include <optional>
#include <tuple>

struct Foo
{
 std::string s;
 size_t b,e;
};

template<std::size_t sz>
auto Baz(std::array<Foo, sz> args)
{
	std::cout << "cnt = " <<  args.size() << std::endl;
	for (auto &a : args)
		std::cout << a.s << std::endl;
	return 0;
}

std::optional<int> ff() {return std::nullopt ;}

consteval int args_cnt(const char *str)
{
	int ret = 0;
	for (;  *str != '\0';  ++ str)
		if (*str == '}')
			++ ret;
	return ret;
}

#define call_baz(first, ...) \
Baz(std::array<Foo, args_cnt(#__VA_ARGS__)>{ Foo first __VA_OPT__(,) __VA_ARGS__})

int main()
{
	call_baz( {"first", 4, 2}, {"second", 6, 2}, {"third", 6, 2} );
	return 0;
}