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

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

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

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

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

行为模型示例:

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

结构模型示例:

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

这里的主要问题是“模型”。 正如那里列出的那样,每个模型都有一个 TIME 模板参数,我可以根据需要获得任意数量的 B 模型。但是,我无法将 S 模型传递给它。

我对 models_tuple 的实现如下

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

有什么方法可以使元组同时接收带有模板参数(时间)的类和没有它的其他类? 我使用 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...>;
};

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

关于c++ - 是否可以在 C++14 中创建具有可选模板参数的类型元组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40275321/

相关文章:

c++ - 垂直翻转图像

c++ - 使用通用私有(private)成员设计模板类

c++ - 模板化成员函数不能从同一个类调用非模板化成员函数,C++

c++ - 逗号运算符和逗号分隔符有什么区别?

c++ - 为类的 AllocatorAwareContainer 数据成员使用自定义分配器

c++ - 使用 enum 来确定返回结果的类型(使用 Macro 的 hack)

c++ - Iter 类的 operator!= 实现

c++ - 如何获取keyPoint ID

c++ - 如何创建仅包含主文件和模板 header 的 makefile (C++)

c++ - Qt 在从 SQLite 内存数据库中选择时进行浅拷贝