Как запросить constexpr std :: tuple во время компиляции? - PullRequest
21 голосов
/ 23 февраля 2011

В C ++ 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, но почему-то звучит неправильно, не используя класс tuple в новом стандарте ...).

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

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

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

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

нет?

Заранее большое спасибо!- ларс

Ответы [ 2 ]

13 голосов
/ 24 февраля 2011

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

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

0 голосов
/ 24 февраля 2011

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

...