Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 可以使用C+;中的可选模板参数生成类型元组+;14?_C++_Templates_C++14_Variadic Templates_Template Meta Programming - Fatal编程技术网

C++ 可以使用C+;中的可选模板参数生成类型元组+;14?

C++ 可以使用C+;中的可选模板参数生成类型元组+;14?,c++,templates,c++14,variadic-templates,template-meta-programming,C++,Templates,C++14,Variadic Templates,Template Meta Programming,我在模拟器里工作。该模拟器接收两种模型(行为模型和结构模型)作为输入 行为模型是提供一些必需函数并需要模板参数“TIME”的任何类 结构模型是一组模型(行为模型或结构模型)及其相互作用列表。结构模型不提供行为,因此不需要时间参数 行为模式示例: template<typename TIME> struct B {...}; template<typename connections, typename Ms> struct S { template<typ

我在模拟器里工作。该模拟器接收两种模型(行为模型和结构模型)作为输入

行为模型是提供一些必需函数并需要模板参数“TIME”的任何类

结构模型是一组模型(行为模型或结构模型)及其相互作用列表。结构模型不提供行为,因此不需要时间参数

行为模式示例:

template<typename TIME>
struct B {...};
template<typename connections, typename Ms>
struct S {
    template<typename TIME>
    using models=typename Ms::template type<TIME>;
    ...
};
模板
结构B{…};
结构模型示例:

template<typename TIME>
struct B {...};
template<typename connections, typename Ms>
struct S {
    template<typename TIME>
    using models=typename Ms::template type<TIME>;
    ...
};
模板
结构{
模板
使用models=typename Ms::template type;
...
};
这里的主要问题是“模型”。 正如上面列出的,每个模型都有一个时间模板参数,我可以得到任意多的B模型。但是,我无法将S模型传递给它

我对models_元组的实现如下

template<template<typename TIME> class... Ms>
struct models_tuple {
    template<typename T>
    using type=std::tuple<Ms<T>...>;
};
模板
结构模型{
模板
使用type=std::tuple;
};
有什么方法可以让元组同时接收带有模板参数(Time)的类和没有模板参数(Time)的类?
我使用static_assert来验证类是否满足实现函数的要求。

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

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...>;
};
模板
结构可能应用时间{using type=W;};
模板
结构可能应用时间{using type=B;};
模板
结构模型{
模板
使用type=std::tuple;
};

并将其用作模型元组。

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

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...>;
};
模板
结构可能应用时间{using type=W;};
模板
结构可能应用时间{using type=B;};
模板
结构模型{
模板
使用type=std::tuple;
};

并将其用作
模型组。

模板类B
应为模板参数的默认形式。这允许用户使用,例如,
wrap
@LucDanton它还允许您执行
wrap
操作,并使其在机器内部爆炸,而不是在使用点爆炸。不确信它应该是默认值。@LucDanton:而且仍然有
模板使用默认值\u vector=std::vector
然后
换行
以允许常规
向量
。谢谢您的回答。对我来说,关键是前两行。我试着用省略号做包装,但没用。问题是,我假设模板类型参数可以用作“0模板参数”的模板参数。将此标记为解决方案。
模板类B
应为模板参数的默认形式。这允许用户使用,例如,
wrap
@LucDanton它还允许您执行
wrap
操作,并使其在机器内部爆炸,而不是在使用点爆炸。不确信它应该是默认值。@LucDanton:而且仍然有
模板使用默认值\u vector=std::vector
然后
换行
以允许常规
向量
。谢谢您的回答。对我来说,关键是前两行。我试着用省略号做包装,但没用。问题是,我假设模板类型参数可以用作“0模板参数”的模板参数。将此标记为解决方案。