我在模板上有一个很大的家庭作业,其中一部分是创建一个结构template <typename... Types> struct Foo
,它包含一个公共结构template<typename Type> struct Bar
,它共享(在公共type
定义中)一个结构其中我们必须包含一个公共方法template<typename Type> static constexpr size_t count();
,如果在1
和Foo
或Bar
的参数中给出了类型,则会输出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
...我从未见过这样的事情,所以我只能猜测它是如何完成的。
那么,我是否正在思考这个问题,或者我应该以某种方式接近它?我将不胜感激任何帮助(不仅仅是完整的解决方案) - 欢迎任何有用的链接。
答案 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...> {};