我有一个类,它被传递了任意数量的模板参数。我想创建一个using来存储它们
我想了很久,没有找到合适的答案
template <typename... Ts>
class TypeSet {
using T = Ts; // something like that
}
template<typename... Ts>
constexpr auto return_unique() {
// something to create TypeSet<NewTs...> set
return set;
}
// return_unique<int, int> --> TypeSet<int>
template <typename... Ts>
class myobj {
using unique_template = return_unique<Ts...>()::T;
}
2条答案
按热度按时间pes8fvy91#
给定一个
X = TypeSet<T...>
,你可以像这样得到一个参数包T...
:您也可以将它们存储在
std::tuple
中:using T = std::tuple<Ts...>;
。或者,同样,您可以使用TypeSet
本身来保存类型:using T = TypeSet<Ts...>
。gpfsuwkq2#
我有一个类,它被传递了任意数量的模板参数。我想创建一个using来存储它们
我有一个模板函数,它将返回一个具有模板值的TypeSet对象 没有重复。我想得到这些模板参数的包
例如
return_unique<int, int, float>
-->TypeSet<int, float>
让我们使用您已经拥有的
TypeSet
,进行一次调整:我们不需要using T
部分。这应该做到:
现在我们需要一种方法来检查在给定的
TypeSet
中是否存在 any 类型T
。现在我将介绍一个检查Any
-稍后我们将看到如何用一行程序来替换它。让我们从 false case开始:
这将是以下情况“失败”时的回退情况:
真实案例(True Case):在
TypeSet
的头部有一个T
最后:在
TypeSet
的头部没有T
?检查一下尾部有了这个,我们就可以实现您的 * 独特 *。实现它的一种方法是从给定的列表中逐个取出元素
T
到内部列表(我们称之为L
),如果!Any<T, L>::value
:让我们从基本案例开始:
也就是说,如果我们已经用尽了
From
列表,我们就剩下To
列表了。最后
还有一个化名让一切更方便(注意,我们给予它一个空的
TypeSet<>
作为我们的内部列表开始)现在我们只需要确认它是否有效:
编辑:感谢Jarod42的精彩评论
Any<T, TypeSet<Us...>>::value
可以替换为(std::is_same_v<T, Us> || ...)
节省了代码行-我们最终得到了