Я хочу написать шаблонную функцию, которая принимает либо array<int, 3>
, либо int[3]
. Я пытаюсь зафиксировать это в enable_if
:
template<typename T>
enable_if_t<is_array_v<T> && extent_v<T> == 3U || !is_array_v<T> && tuple_size<T>::value == 3U> foo(const T& param) {}
К сожалению, для int[3]
, tupple_size
не определено, что приводит к сбою компиляции шаблона до оценки короткого замыкания.
Я также пытался сделать это с помощью conditional
, но у него та же проблема: убедиться, что оба варианта действительны для T
, прежде чем рассматривать условие.
Я знаю, что могу сделать это, специализируясь. Но код точно такой же в теле функции. Я ненавижу тот факт, что я специализируюсь, когда реализация одинакова.
Можно ли вызвать короткое замыкание до оценки условий?
extent_v
иconst T& param
. Конечно, вы можете использовать специализацию, чтобы определить трейт для управления SFINAE, что позволяет избежать повторения тела функции. - person aschepler   schedule 29.08.2018my_is_array
илиarray_size_or_zero
из ответа Болова - это то, что я имел в виду под определением черты. - person aschepler   schedule 30.08.2018