首页 > 解决方案 > 可以根据模板参数有条件地添加 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.

有没有办法做这样的事情?

标签: c++tuplestemplate-meta-programming

解决方案


您的问题的一小部分没有计算:

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)使用它将元组的正确组合粘合在一起。


推荐阅读