【发布时间】:2014-07-14 09:02:19
【问题描述】:
我正在寻找一种从模板参数包中删除(现在假设所有出现)类型的方法。最终结果将是一个看起来像这样的结构:
template<typename T, typename...Ts>
struct RemoveT
{
using type = /* a new type out of Ts that does not contain T */
}
假设边缘情况 RemoveT<int, int> 将通过返回 void 来处理(未在下面的代码中处理)。我的最初的设计是这样的:
// --------------------------------------------------------------
// 1. A "way" of typedefing variadic number of types ------------
template<typename...Ts>
struct pack {
using type = Ts;
};
// --------------------------------------------------------------
// --------------------------------------------------------------
template<typename T, typename...Ts> struct RemoveT;
template<typename T, typename T1, typename...Ts>
struct RemoveT {
using type = typename pack<T1, typename RemoveT<T, Ts...>::type>::type;
};
template<typename T, typename T1>
struct RemoveT<T, T1> {
using type = T1;
};
template<typename T, typename...Ts>
struct RemoveT<T, T, Ts...> {
using type = typename RemoveT<Ts...>::type;
};
// --------------------------------------------------------------
现在我什至无法开始测试这段代码,因为the pack structure is not valid C++
重申
以防万一这对答案有帮助,解决它的其他一些想法
- 有人可能会说
pack根本没有用。相反,我们可以移动RemoveT结构,创建一个仅包含所需类型的新RemoveT。然后问题转变为从结构中提取类型 - 我们可以创建模仿 typelists 行为的类型对,并对此采取更递归的方法。
底线
对于可变参数类型 Ts 和类型 T:我可以从 Ts 创建 Us 省略 T 吗?
【问题讨论】:
-
当我在思考这个问题的时候,我很好奇我会被用来做什么。 IE。什么是示例应用程序?
-
@WhozCraig 好点。引用一位伟大的程序员“如果我告诉你,我将不得不杀了你或雇用你”:P ...当然还有好奇心
-
你是对的,你不能像你在这里概述的那样拥有
struct pack。但是您可以使用std::tuple,例如:typedef std::tuple<Ts...> type;,这可能是一种快速获取所需内容的方法。 -
这似乎很宽泛。您确定您不是在寻找某种描述的留言板或聊天室吗?
-
@DeadMG 没有提到你的名字 man(也没有提到)。我没有直接的抱怨,我只是在回复 Lighness。对任何你认为值得投反对票的东西投反对票是完全可以的,我不需要知道原因。
标签: c++ templates c++11 variadic-templates template-meta-programming