- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
考虑这段代码
#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.
这甚至可能是我正在尝试做的事情吗?
最佳答案
您遇到的问题是您不能混合采用不同非类型参数的模板模板。在您的示例中,这意味着 ObjectValue
和 ThingValue
无法绑定(bind)到 template <typename> class...
.
解决此问题的一种方法是在某种类型的模板中对您的枚举进行编码,该模板可以不分青红皂白地容纳它们。一种可能的方法是将枚举视为 int
s 并让用户担心传递合理的类型。
首先,我们围绕您当前的类型创建包装器:
template <typename> struct ThingValueWrapper;
template <int I>
struct ThingValueWrapper<std::integral_constant<int,I>>
: ThingValue<static_cast<Thing>(I)>
{};
template <typename> struct ObjectValueWrapper;
template <int I>
struct ObjectValueWrapper<std::integral_constant<int, I>>
: ObjectValue<static_cast<Object>(I)>
{};
然后我们可以做一些与您最初所做的非常相似的事情:
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...>
: std::integral_constant<int,
First<typename ComposeValues<T, Value, Rest...>::type>::value>
{};
template <typename T, T Value>
struct ComposeValues<T, Value> : std::integral_constant<int, static_cast<int>(Value)> {};
与您的原始用例的唯一区别是我们需要使用我们的包装器而不是原始的枚举特征:
ComposeValues<Object, Object0, ThingValueWrapper, ObjectValueWrapper>::value
关于c++ - 组成 std::integral_constant 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30936019/
MSVC 和 clang/gcc 对于是否可以在三元运算符中使用两个不同的整型常量(以及它们是否具有 common_type)存在分歧: #include int main() { retu
我想将传递给函数的编译时间常量整数捕获为模板类型。 future 的目标是推出我自己的(非常有限的)表达式模板,该模板从非常简单的表达式(编译时常量 int 和 in 变量的总和)创建表达式,例如:-
我刚刚进入元编程,正在 youtube 上观看 Cppcon channel ,并看到了这个 std::integral_constant ,但找不到它的用途。 据我所知,这是一种将值与其类型一起“打
您能否解释一下,为什么以下示例中的 integral_constant 和 constexpr 方法会导致不同的行为? #include using namespace std; struct Lo
利用Scott Schurr's str_const我有一个 constexpr 字符串。 class StrConst { public: template constexpr St
它的实际用例是什么? std::integral_constant 我可以理解这是一个值为 2 的包装器: typedef std::integral_constant two_t 但为什么不直接使用
考虑这段代码 #include #include enum Thing {Thing0, Thing1, Thing2, NumThings}; enum Object {Object0, Obj
在C++标准库中,有没有对integral_constant进行 bool 运算的模板类型? (其中 X 是 true 或 false )? 作为一个简单的例子,您有两个这样的函数重载: void f
昨天我读了一个blog entry关于将编译时已知函数参数从 constexpr 函数转换为类似 std::integral_constant<> 的类型. 一个可能的用法示例是从用户定义的文字转换类
我想创建一个 std::integral_constant 的“容器版本”。这是一个用元素类型和非类型参数参数化的类型: enum class A { a = 1 struct static
很抱歉问了这么简单的问题,但我无法轻易找到答案。 Google 对“C++ 否定 integral_constant”和类似查询没有任何有趣的说法。 在 C++11 中是否有任何特征使 std::tr
查看 std::is_same 的实现我们可以看到一些内部函数(继承自 integral_constant )。为了方便起见,让我复制 g++ 代码: template struct inte
我有几种类型,我想“绑定(bind)”一个 std::integral_constant编译时每种类型的顺序 ID 值。 例子: struct Type00 { }; struct Type01 {
我设法转换了一个 template struct List到 integral_constant 的列表但是,是否可以从 integral_constant 转换为回到int是吗? 以下是我如何从 I
#include #include int main(){ //creating an integral constant with constexpr constexpr uns
我想从 char* 和“kernel32.dll”中获取整数常量,但总是失败。以下是我失败的尝试,谁能告诉我正确的用法? error 1: cout ::value ::value ::value (
在C++14标准中,std::integral_constant模板定义如下: template struct integral_constant { static constexpr T va
#include #include #include #include template auto make_index_dispatcher(std::index_sequence) {
假设我有一个 hana::integral_constant 的元组,如下所示: auto tuple_of_int_const = hana::make_tuple(hana::integral_c
从 C++20 开始可以使用 auto实现整数常量的模板参数: Try it online! template struct integral_constant2 : std::integr
我是一名优秀的程序员,十分优秀!