是否可以在 C++14 中创建具有可选模板参数的类型元组?
Is possible to make a tuple of types with optional template parameters in C++14?
我正在模拟器中工作。该模拟器接收 2 种模型、行为模型和结构模型作为输入。
一种行为模型,是一些 class,它提供一些必需的功能并需要一个模板参数 "TIME"。
结构模型是一组模型(行为或结构)以及它们之间的交互列表。结构模型,不提供行为,因此不需要 TIME 的参数。
行为模型示例:
template<typename TIME>
struct B {...};
结构模型示例:
template<typename connections, typename Ms>
struct S {
template<typename TIME>
using models=typename Ms::template type<TIME>;
...
};
这里的主要问题是"models"。
正如那里列出的那样,每个模型都有一个 TIME 模板参数,我可以根据需要获得任意数量的 B 模型。但是,我无法将 S 模型传递给它。
我的 models_tuple 实现如下
template<template<typename TIME> class... Ms>
struct models_tuple {
template<typename T>
using type=std::tuple<Ms<T>...>;
};
有什么方法可以使元组同时接收,class带有模板参数(时间)的元组和没有它的其他元组?
我正在使用 static_assert 来验证 classes 是否满足实现功能的要求。
不能混合使用模板模板参数和模板类型参数。但是你可以把前者包装成一个类型。
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. */>.
我正在模拟器中工作。该模拟器接收 2 种模型、行为模型和结构模型作为输入。
一种行为模型,是一些 class,它提供一些必需的功能并需要一个模板参数 "TIME"。
结构模型是一组模型(行为或结构)以及它们之间的交互列表。结构模型,不提供行为,因此不需要 TIME 的参数。
行为模型示例:
template<typename TIME>
struct B {...};
结构模型示例:
template<typename connections, typename Ms>
struct S {
template<typename TIME>
using models=typename Ms::template type<TIME>;
...
};
这里的主要问题是"models"。 正如那里列出的那样,每个模型都有一个 TIME 模板参数,我可以根据需要获得任意数量的 B 模型。但是,我无法将 S 模型传递给它。
我的 models_tuple 实现如下
template<template<typename TIME> class... Ms>
struct models_tuple {
template<typename T>
using type=std::tuple<Ms<T>...>;
};
有什么方法可以使元组同时接收,class带有模板参数(时间)的元组和没有它的其他元组? 我正在使用 static_assert 来验证 classes 是否满足实现功能的要求。
不能混合使用模板模板参数和模板类型参数。但是你可以把前者包装成一个类型。
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. */>.