c++ - 可以根据模板参数有条件地添加 C++ 元组元素类型吗?
问题描述
我正在尝试根据一些编译时条件有条件地将类型添加到元组模板类型,如下所示:
template <typename T>
class Base { ... }
template <int I>
class Derived : public Base<std::tuple<std::conditional<I % 8 == 0, int, void>::type,
std::conditional<I % 4 == 0, double, void>::type,
std::conditional<I % 2 == 0, float, void>::type>>
{ ... }
我知道这不是有效的代码,但从概念上讲,我试图有条件地将类型添加到元组的列表中。我希望在条件解析为void
.
有没有办法做这样的事情?
解决方案
您的问题的一小部分没有计算:
std::conditional<I % 1 == 0, float, void>:
由于任何整数除以 1 的余数为 0,因此此条件将始终为真。
无论此处的实际意图是什么,我将仅举一个示例,其中包含两个条件,可以根据需要轻松扩展以包含其他条件:
#include <tuple>
#include <functional>
template <typename T>
class Base {};
template <int I>
class Derived : public Base<
decltype(std::tuple_cat(
std::declval<
std::conditional_t<I % 4 == 0,
std::tuple<int>,
std::tuple<>>>(),
std::declval<
std::conditional_t<I % 2 == 0,
std::tuple<float>,
std::tuple<>>>()
))>
{
};
Derived<4> a;
Base<std::tuple<int, float>> &b=a;
Derived<2> c;
Base<std::tuple<float>> &d=c;
这利用了对std::tuple_cat
非常满意的事实,std::tuple<>
我们只需要(ab)使用它将元组的正确组合粘合在一起。
推荐阅读
- c# - 如何将多选列表绑定到对象列表中的属性?
- c - 使用批处理文件更改 .c 文件顶部的数字
- javascript - JavaScript 与时区的日期差异
- android - 我正在从adatper调用一个方法来显示错误
- javascript - 用 antd 反应动态表单值
- javascript - 标签弄乱了我在 Photoshop 中的切片布局
- python - Python Pandas 阅读
- android - 重载解析歧义:String Builder kotlin?
- amazon-web-services - 传递 ec2 实例 id 时 terraform 中的属性值类型错误
- vba - 在 SlideShowMode 期间执行 Mso