LINUX.ORG.RU

Как правильно унаследоваться от std::variant?

 ,


0

3

Хочется сделать контейнер, что-то вроде такого:

template <int n>
struct foo {
	float v[n];
};

struct foo_holder : std::variant<foo<1>, foo<2>> {
	
	struct {/* some stuff */} info;
	
	foo_holder (int nd) {
		if (nd==1) /* foo<1> */;
		if (nd==2) /* foo<2> */;
	}
};
Где хранимый тип определяется параметрами конструктора. Никак не пойму как такое сделать правильно. Или как тут лучше быть?

★★★★★

Последнее исправление: thunar (всего исправлений: 1)
Ответ на: комментарий от X512

У тебя нет абсолютно никакой разницы с тем, что написал ТС.

Если у foo<1> нет дефолтного конструктора (или его по какой-то причине не хочется вызывать), и код ТСа, и твой код одинаково непригодны.

intelfx ★★★★★
()
Ответ на: комментарий от X512

код в заглавном сообщении работает «как есть».

Проблемы с ним могут возникнуть только в одном случае — когда default-initialization std::variant’а по тем или иным причинам недопустимо или невозможно.

intelfx ★★★★★
()
Ответ на: комментарий от X512

Вот такие примеры нашёл [https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/p2162r0.html]. Как я понимаю, обычно просто снаружи присваивают. Мне в конструкторе нужно, т.к. каждый инстанс foo кодирует численную схему (в зависимости от размерности задачи), которую потом удобно передавать в визитор, что бы для неё выбирались соответствующие функции из числодробильного бекенда, а наружу возвращался биндинг.

thunar ★★★★★
() автор топика