Декартово произведение 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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