Как запросить 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
Ответы
Ответ 1
std::get
не помечен constexpr
, поэтому вы не можете использовать его для извлечения значений из tuple
в контексте constexpr
, даже если этот кортеж сам является constexpr
.
К сожалению, реализация std::tuple
непрозрачна, поэтому вы также не можете писать свои собственные аксессоры.
Ответ 2
Я еще не работал с С++ 0x, но мне кажется, что std:: get() - это функция, а не выражение, которое может интерпретировать компилятор. Таким образом, он не имеет смысла, кроме как во время выполнения, после того, как сама функция была скомпилирована.