Подтвердить что ты не робот

Как запросить constexpr std:: tuple во время компиляции?

В С++ 0x можно создать constexpr std:: tuple, например. как

#include <tuple>
constexpr int i = 10;
constexpr float f = 2.4f;
constexpr double d = -10.4;
constexpr std::tuple<int, float, double> tup(i, f, d);

Также можно запросить std:: tuple во время выполнения, например. с помощью

int i2 = std::get<0>(tup);

Но невозможно запросить его во время компиляции, например,

constexpr int i2 = std::get<0>(tup);

вызовет ошибку компиляции (по крайней мере, с последним g++ моментальный снимок 2011-02-19).

Есть ли другой способ запроса constexpr std:: tuple во время компиляции?

И если нет, есть ли концептуальная причина, почему никто не должен ее запрашивать?

(Я знаю об избежании использования std:: tuple, например, используя boost:: mpl или boost:: fusion вместо этого, но почему-то кажется неправильным не использовать класс кортежа в новом стандарте...).

Кстати, кто-нибудь знает, почему

  constexpr std::tuple<int, float, double> tup(i, f, d);

компилируется отлично, но

  constexpr std::tuple<int, float, double> tup(10, 2.4f, -10.4);

нет?

Большое спасибо! - lars

4b9b3361

Ответ 1

std::get не помечен constexpr, поэтому вы не можете использовать его для извлечения значений из tuple в контексте constexpr, даже если этот кортеж сам является constexpr.

К сожалению, реализация std::tuple непрозрачна, поэтому вы также не можете писать свои собственные аксессоры.

Ответ 2

Я еще не работал с С++ 0x, но мне кажется, что std:: get() - это функция, а не выражение, которое может интерпретировать компилятор. Таким образом, он не имеет смысла, кроме как во время выполнения, после того, как сама функция была скомпилирована.