为可变参数模板中给出的所有类型添加模板特化

时间:2015-12-01 18:28:19

标签: c++ templates

我在模板上有一个很大的家庭作业,其中一部分是创建一个结构template <typename... Types> struct Foo,它包含一个公共结构template<typename Type> struct Bar,它共享(在公共type定义中)一个结构其中我们必须包含一个公共方法template<typename Type> static constexpr size_t count();,如果在1FooBar的参数中给出了类型,则会输出0。示例(以下代码应编译):

using FooBar = Foo<foo1,foo2,foo3>;

using Foo1Type = FooBar::Bar<foo1>::type;
// foo1 was given as argument to Foo and Bar
static_assert(Foo1Type::count<foo1>() == 1);
// foo2 was given as argument to Foo, but not Bar
static_assert(Foo1Type::count<foo2>() == 0);

using Foo4Type = FooBar::Bar<foo4>::type;
// foo4 was not given as argument to Foo
static_assert(Foo4Type::count<foo4>() == 0); 
static_assert(Foo4Type::count<foo1>() == 0);

对我来说它看起来很硬(我是模板的新手,刚刚开始阅读它们),似乎我们必须遍历Foo的可变参数模板参数,并且在迭代期间以某种方式为内部创建新的特化结构Bar ...我从未见过这样的事情,所以我只能猜测它是如何完成的。

那么,我是否正在思考这个问题,或者我应该以某种方式接近它?我将不胜感激任何帮助(不仅仅是完整的解决方案) - 欢迎任何有用的链接。

1 个答案:

答案 0 :(得分:1)

据我所知,你的内在功能就像是:

return contain<Type, TBar>{} && contain<Type, TFoos...>{};

该结构包含可以写成:

template <typename T, typename ... Ts> struct contain;

// Partial specializations
// Empty case
template <typename T> struct contain<T> : std::false_type {};

// Found
template <typename T, typename ... Tail>
struct contain<T, T, Tail...> : std::true_type {};

// Not found, iterate the list
template <typename T, typename Head, typename ... Tail>
struct contain<T, Head, Tail...> : contain<T, Tail...> {};

Demo