创建一个类似于 std::integral_constant 的容器
Create a container like std::integral_constant
我想创建一个std::integral_constant
的"容器版本"。这是一个使用元素类型和非类型参数参数化的类型:
enum class A {
a = 1 << 0,
b = 1 << 1,
c = 1 << 2
};
template<typename T, T... Values>
struct static_container final {};
template<typename T, T... Ts>
constexpr auto make_static_container(T...) { // wrong
return static_container<T, Ts...>{};
}
template<typename F, F... FF>
void inline set(static_container<F, FF...>) {
std::cout << sizeof... (FF) << std::endl;
}
int main() {
constexpr static_container<A, A::a, A::b> sc1{}; //ok
constexpr auto sc2 = make_static_container(A::a, A::c); // not-ok
set(sc1);
set(sc2);
}
上面你可以看到我可以用显式类型创建sc1
。
现在我喜欢有一个辅助函数来创建这样的类型,而无需指定(冗余)枚举类型。
此处的输出为:
2
0
有什么提示吗?
作为您对std::integral_constant
的评论的后续,如下所示:
template<typename T, T... Values>
constexpr auto make_static_container(std::integral_constant<T, Values>...) noexcept {
return static_container<T, Values...>{};
}
调用站点将不得不更改,因为该函数现在采用std::integral_constant<T>
s而不是直接T
s;它有点嘈杂,但变量模板可以防止它太痛苦:
template<A a>
using A_ = std::integral_constant<A, a>;
template<A a>
constexpr A_<a> a_{};
int main() {
// explicit construction via alias template:
constexpr auto sc1 = make_static_container(A_<A::a>{}, A_<A::b>{});
// implicit construction via variable template:
constexpr auto sc2 = make_static_container(a_<A::a>, a_<A::c>);
set(sc1);
set(sc2);
}
在线演示
(顺便说一句,在 C++17 中,演示中对 static_container::value
的单独定义变得不必要。
您的问题是您没有将函数的参数传递给用于创建返回值的模板参数列表
template<typename T, T... Ts>
constexpr auto make_static_container(T... /* !!! unused values !!! */) { // wrong
return static_container<T, Ts...>{};
}
所以唯一推导的模板是T
;没有推导Ts
模板非类型值;所以返回的类型是
return static_container<T>{};
即零值。
你应该能够使用函数的参数并将它们作为模板传递,而不是类型参数;类似于
template<typename T0, typename ... Ts>
constexpr auto make_static_container (T0 const t0, Ts const ... ts)
{ return static_container<T0, t0, ts...>{}; }
但这在 C++11/C++14 中是不可能的(据我所知),因为 t0
/ts
值不是constexpr
值
相关文章:
- 为什么static_assert错误:即使我传递常量"expression must have a constant value"?
- 为什么在main()之前断言会导致语法错误"error: expected ')' before numeric constant"?
- 错误 C2059:语法错误:从结构成员声明'constant'
- 如何修复 eigen3 中的'non-type template argument is not a constant expression'?
- 编译为 cuda 内核调用提供了"expression must have integral or unscoped enum type"
- 如何修复此错误"the value of 'x1' is not usable in a constant expression"?static_assert
- [conv.integral]/3 在最新的C++草案中
- 模板元编程:"does not have integral or enumeration type"
- 为什么 <constant-int> A / 在 A 无符号时比有符号更快?
- 为什么不允许优化器折叠"constant context"?
- 如何避免"'=': truncation of constant value"的警告消息?
- 当值不能恒定时如何修复"Expression must have a constant value"?
- 将 int 与 double 进行比较的预处理器"invalid integer constant expression"
- 外部"C"导致错误"expected '(' before string constant"
- 我可以忽略"Intellisense: (E0028) expression must have a constant value"吗?
- 即使我没有 #define 任何东西或错过分号,如何修复"expected unqualfied-id before string constant"?
- 如何修复"static assertion failed: template argument not an integral type"错误?
- 字符串初始化失败:"expression must have integral or unscoped enum type"
- C :与宏定义的字符串Concat Constant String
- IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX_V2 Constant Val