Вопрос
Можно ли создать складной (※ выражение сгиба ) шаблон пакет параметров ?
Пример
Рассмотрим следующий пример (функция, которая принимает два аргумента типа int
( decayed )).
template<
typename L,
typename R,
typename = std::enable_if_t<
std::is_same_v<int, std::decay_t<L>>
&& std::is_same_v<int, std::decay_t<R>>
>
>
int F(L Left, R Right){
return 0x70D0;
}
Можно ли создать пакет параметров шаблона, который можно свернуть, чтобы избежать записиодин и тот же фрагмент кода несколько раз ( то есть std::is_same_v
)?
То, что представлено ниже как std::pack
, может упростить использование SFINAE?
typename = std::enable_if_t<(... && std::is_same_v<int, std::decay_t<std::pack<L, R>>>)>
Что я 'я пробовал
Я пытался решить проблему, используя T
pack и совмещая псевдонимы L
и R
.Но по некоторым причинам следующий код компилируется и запускается без ошибки (второй аргумент второго F
вызова функции, затухший, не равен int
) в MSVC 15.9.4 + 28307.222:
template<
typename... T,
typename L = std::tuple_element_t<0, std::tuple<T...>>,
typename R = std::tuple_element_t<1, std::tuple<T...>>,
typename = std::enable_if_t<(... && std::is_same_v<int, std::decay_t<T>>)>
>
int F(L Left, R Right){
return 0x70D0;
}
int main(){
F(3, 5); // OK
F(3, "5"); // OK, but should not compile
}
PS Кроме того, я что-то упустил в приведенном выше коде, чтобы заставить SFINAE работать должным образом (функции фильтра только с int, int
(затухшими) аргументами)?