1
考虑以下代码撰写的std :: 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...>
因此,上述在main()可以写成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