Рассмотрим этот кодСоставление СТД :: integral_constant значения
#include <iostream>
#include <type_traits>
enum Thing {Thing0, Thing1, Thing2, NumThings};
enum Object {Object0, Object1, Object2, NumObjects};
template <Thing> struct ThingValue;
template <> struct ThingValue<Thing0> : std::integral_constant<int, 5> {};
template <> struct ThingValue<Thing1> : std::integral_constant<int, 2> {};
template <> struct ThingValue<Thing2> : std::integral_constant<int, 12> {};
template <Object> struct ObjectValue;
template <> struct ObjectValue<Object0> : std::integral_constant<Thing, Thing2> {};
template <> struct ObjectValue<Object1> : std::integral_constant<Thing, Thing0> {};
template <> struct ObjectValue<Object2> : std::integral_constant<Thing, Thing1> {};
int main() {
std::cout << ThingValue<ObjectValue<Object0>::value>::value << '\n'; // 12
}
Я пытаюсь определить, ComposeValues<T, Value, Pack...>
так, что выше в основной() можно записать в виде ComposeValues<Object, Object0, ThingValue, ObjectValue>::value
. Таким образом, это может быть распространено на любое количество таких композиций. Не совсем важно что-то делать, но я бы подумал, что это было бы неплохое упражнение, чтобы определить такую вещь. Но у меня возникают трудности с синтаксисом:
template <typename T, T Value, template <typename> class...> struct ComposeValues;
template <typename T, T Value, template <typename> class First, template <typename> class... Rest>
struct ComposeValues<T, Value, First, Rest...> {
static auto value = First<typename ComposeValues<T, Value, Rest...>::value>::value;
};
template <typename T, T Value, template <T> class Last>
struct ComposeValues<T, Value, Last> : std::integral_constant<T, Last<Value>::value> {}; // Won't compile.
Возможно ли это, что я пытаюсь сделать?
[demo] (https: // ideone. com/OzYg2O) – TartanLlama
Одним из недостатков этого является то, что окончательный тип стирается, но вы можете справиться с этим довольно легко, выполнив окончательное приведение в 'T'. – TartanLlama
Хорошо, я изучил ваше решение, и я понял. Но последнее предложение написать 'ComposeValues