是否可以在C ++ 14中创建带有可选模板参数的类型元组?

时间:2016-10-27 02:51:47

标签: c++ templates c++14 variadic-templates template-meta-programming

我在模拟器中工作。该模拟器接收2种模型,行为和结构作为输入。

行为模型,是一些提供一些必需功能并需要模板参数的类#34; TIME"。

结构模型,是一组模型(行为或结构)以及它们之间的相互作用列表。结构模型不提供行为,因此不需要TIME的参数。

行为模型示例:

template<typename TIME>
struct B {...};

结构模型示例:

template<typename connections, typename Ms>
struct S {
    template<typename TIME>
    using models=typename Ms::template type<TIME>;
    ...
};

主要问题是&#34;模型&#34;这里。 正如它在那里列出的那样,每个模型都有一个TIME模板参数,我可以得到尽可能多的B模型。但是,我无法将S模型传递给它。

我对models_tuple的实现如下

template<template<typename TIME> class... Ms>
struct models_tuple {
    template<typename T>
    using type=std::tuple<Ms<T>...>;
};

有什么方法可以让元组同时接收带有Template参数(Time)的类和没有它的其他类? 我使用static_assert验证类是否涵盖了实现函数的要求。

1 个答案:

答案 0 :(得分:4)

您不能混合使用模板模板参数和模板类型参数。但是你可以将前者包装成一个类型。

template<template<class> class B>
struct wrap {};

然后,添加时间,但前提是它是第一种类型的包装器:

template<class W, class>
struct maybe_apply_time { using type = W; };

template<class T, template<class> class B> 
struct maybe_apply_time<wrap<B>, T> { using type = B<T>; };

template<class... Ms>
struct models_tuple {
    template<typename T>
    using type=std::tuple<typename maybe_apply_time<Ms, T>::type...>;
};

并将其用作models_tuple<wrap<B>, S</*...*/> /*, etc. */>.