【问题标题】:Shortcuts for repeated template arguments重复模板参数的快捷方式
【发布时间】:2021-02-17 13:52:46
【问题描述】:

假设我有一堂课:

template <typename A, typename B, typename C>
class Foo {
};

其中通常AB 是同一类型,但我想保留单独定义B 的选项。我想定义一个额外的模板,比如说,

template <typename A, typename C>
class Foo {
};

这只是Foo&lt;A, A, C&gt; 的包装。这是常见的做法吗?如果是这样,最简单的方法是什么?

【问题讨论】:

标签: c++ c++11 templates parameters


【解决方案1】:

不是唯一的解决方案,但如果可行,它是最简单的:更改BC 的顺序并为B 提供默认值:

#include <type_traits>

template <typename A, typename C, typename B = A>
class Foo {
};


int main(){
    using Foo1 = Foo<int,double,int>;
    using Foo2 = Foo<int,double>;
    static_assert( std::is_same<Foo1, Foo2>::value);
}

【讨论】:

    【解决方案2】:

    我这样理解你的问题(根据评论,问题由两个问题组成,都得到了单独的回答):如果 AB 代表相同的类型,请使用模板的替代版本。

    所以看起来你实际上正在尝试做的是partial template specialization

    例子:

    template <typename A, typename B, typename C>
    class Foo {
    public:
        using type = B;
    };
    
    template <typename A, typename C>
    class Foo<A, A, C> {
    public:
        using type = C;
    };
    

    简单演示:https://godbolt.org/z/KPz4jj

    【讨论】:

    • 这看起来是我想要的,但是当我在你的示例中尝试 print&lt;Foo&lt;double, float&gt;::type&gt;(); 时,我收到了一个错误,而我本来希望得到 void print() [with T = float]
    • 要缩短模板的参数,您需要默认类型,但这仅适用于列表后面的参数(这由其他答案显示)。在您的示例中,默认值为第二个参数,但这无法完成(编译器如何检测到您跳过了第二个参数?)。唯一的方法是定义 typedef 或 type alias 将接受较少数量的参数。根据您的上下文,也可以利用模板参数检测,但这需要一个接收参数/变量的函数。
    • 这两个答案的编译可能会解决问题,但您必须牺牲模板扩充的顺序。
    猜你喜欢
    • 2010-12-04
    • 1970-01-01
    • 1970-01-01
    • 2011-06-20
    • 1970-01-01
    • 2016-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多