可以根据模板参数有条件地添加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)使用它来将元组的正确组合粘合在一起。