Заставить `std :: get` играть с SFINAE

не знаю, из какой версии хром это доступно, но я нашел настройку «Консоль - Log XMLHttpRequests» (нажав на значок в правом нижнем углу инструментов разработчика в chrome на mac)

16
задан Community 23 May 2017 в 11:45
поделиться

1 ответ

std::get<T> явно не для SFINAE, как указано в [tuple.elem]:

template <class T, class... Types>
  constexpr T& get(tuple<Types...>& t) noexcept;
// and the other like overloads

Требуется: Тип T встречается ровно один раз в Types.... В противном случае, программа является плохо сформированной.

std::get<I> также явно не SFINAE.


Что касается других вопросов:

Есть ли причина для std::get не быть SFINAE-дружественными?

Не знаю. Как правило, это не тот вопрос, который нужно обсуждать. Так что я думаю, это не считалось чем-то, что нужно было сделать. Сложные ошибки намного легче понять, чем пролистывать кучу нежизнеспособных вариантов кандидатов. Если вы считаете, что есть веская причина для того, чтобы std::get<T> был дружественным по отношению к SFINAE, вы можете отправить об этом вопрос LWG.

Есть ли лучший обходной путь, чем описанный выше?

Конечно. Вы можете написать свою собственную дружественную SFINAE версию get (обратите внимание, она использует C ++ 17 сложенное выражение ):

template <class T, class... Types,
    std::enable_if_t<(std::is_same<T, Types>::value + ...) == 1, int> = 0>
constexpr T& my_get(tuple<Types...>& t) noexcept {
    return std::get<T>(t);
}

И затем делать это по своему желанию ,

17
ответ дан SergeyA 23 May 2017 в 11:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: