Декартово произведение std::tupleC++

Программы на C++. Форум разработчиков
Anonymous
Декартово произведение std::tuple

Сообщение Anonymous »

Для модульного тестирования платформы C++17, которая в значительной степени опирается на шаблоны, я попытался написать помощник

Код: Выделить всё

template
классы[/b], которые генерируют декартово произведение двух наборов типов данных, заданное двумя кортежами:

Код: Выделить всё

**Input**: std::tuple  std::tuple

**Expected output**: Cartesian product of the two tuples:
std::tuple
Я знаю, что Boost MP11 предлагает такие функции, но я бы не хотел включать зависимость от еще одной библиотеки только в целях тестирования. На данный момент я придумал довольно простое решение, которое, хотя требует, чтобы класс был конструируемым по умолчанию (попробуйте здесь!):

Код: Выделить всё

template 
class CartesianProduct {
protected:
CartesianProduct() = delete;
CartesianProduct(CartesianProduct const&) = delete;
CartesianProduct(CartesianProduct&&) = delete;
CartesianProduct& operator=(CartesianProduct const&) = delete;
CartesianProduct& operator=(CartesianProduct&&) = delete;

template 
static constexpr auto innerHelper(T, std::tuple) noexcept {
return std::make_tuple(std::make_tuple(T{}, Ts{}) ...);
}
template 
static constexpr auto outerHelper(std::tuple, T) noexcept {
return std::tuple_cat(innerHelper(Ts{}, T{}) ...);
}
public:
using type = std::decay_t;
};
template 
using CartesianProduct_t = typename CartesianProduct::type;
Кроме того, при попытке создать экземпляр списка классов шаблонов аналогичным способом (попробуйте это здесь) мне приходится сделать то же предположение: я не могу применить его к классам, имеющим защищенный/ (без объявления друга) и не могут быть созданы по умолчанию.
Можно ли снять ограничение на конструктивность по умолчанию, не обращаясь к std::integer_sequence и дополнительному вспомогательному классу? Насколько я понимаю, невозможно использовать std::declval() непосредственно в методах InternalHelper и externalHelper (что решило бы мою проблему), так как это, похоже, больше не является неоцененным выражением. По крайней мере, GCC тогда жалуется на сбой статического утверждения: declval() нельзя использовать!, хотя с Clang он, похоже, нормально компилируется.
Заранее спасибо!

Подробнее здесь: https://stackoverflow.com/questions/704 ... f-stdtuple

Вернуться в «C++»