【问题标题】:Is possible to make a tuple of types with optional template parameters in C++14?是否可以在 C++14 中使用可选模板参数创建类型元组?
【发布时间】:2016-10-27 02:51:47
【问题描述】:

我在模拟器中工作。该模拟器接收 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 来验证类是否满足实现功能的要求。

【问题讨论】:

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


    【解决方案1】:

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

    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&lt;wrap&lt;B&gt;, S&lt;/*...*/&gt; /*, etc. */&gt;.

    【讨论】:

    • template&lt;typename...&gt; class B 应该是模板模板参数的默认形式。这允许用户拥有例如wrap&lt;std::vector&gt;.
    • @LucDanton 它还允许您执行wrap&lt;std::pair&gt; 并让它在您的机器内部而不是在使用点爆炸。不相信它应该是默认值。
    • @LucDanton: 还有template &lt;typename T&gt; using default_vector = std::vector&lt;T&gt;;wrap&lt;default_vector&gt; 允许常规vector
    • 感谢您的回答。对我来说,关键是前两行。我尝试使用省略号制作包装器,但没有奏效。问题是我假设模板类型参数可以用作“0模板参数”的模板模板参数。将此标记为解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-22
    • 2020-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-28
    • 1970-01-01
    相关资源
    最近更新 更多