【问题标题】:Alias for template base class function members模板基类函数成员的别名
【发布时间】:2019-01-29 08:41:33
【问题描述】:

我正在编写使用大量模板的代码,我经常偶然发现如下代码:

template<class T, class V>
struct Base {  Base(int a) {} };

template<class T, class V>
struct Derived : public Base<T,V>
 {
 using Base<T,V>::Base; // [1] ok it works
 using Base::Base; // [2] Does not work  
 };

想想当你写而不是T更有意义的名字时,[1]语句变得太长了..有没有办法使用像[2]这样的语句?或者在即将到来的 C++ 标准中有什么可以简化这一点的吗?

【问题讨论】:

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


    【解决方案1】:

    通常,您可以将注入的类名用于此类目的。这里的问题是这个注入的类名是模板化基类的成员,因此它是正式依赖的,因此需要在using Base::Base 中获取第一个Base 的非限定查找找不到它。

    但我们可以在这里操纵查找的工作方式:

    template<class T, class V>
    struct Derived : public Base<T,V>
    {
        using Derived::Base::Base;
    };
    

    DerivedDerived&lt;T,V&gt; 的注入类名。这样就找到了,现在我们正在对 Base 进行合格的查找,因此它的依赖不再是问题。

    【讨论】:

    • 伙伴这太棒了,这正是我要找的!你从哪里学来的这些东西?
    • @svoltron 好吧,在这种情况下,请通过单击答案分数下方的复选标记来接受 StoryTeller 的答案;)
    • @svoltron - 在Stack Overflow 上回答语言律师问题,并在我自己的代码中跌跌撞撞地进入语言的这些黑暗角落。我从来没有真正面对过你的具体问题,但我的脑海里突然出现了这种情况。
    • 嗯,那你应该为此感到自豪
    【解决方案2】:

    只使用Base::Base 的问题在于名称Base(在左侧)应该是父Base&lt;T, V&gt; 的注入类名,但是因为该父是依赖的,它不搜索名称,因此找不到注入的类名。

    您可以通过在依赖上下文中使用注入的类名来解决此问题,以便将其查找推迟到实例化。像这样:

    template<class T, class V>
    struct Derived : public Base<T,V>
     {
     using Derived::Base::Base;
     };
    

    Derived是正常找到的(就是这个实例化注入的类名),并且已知是依赖的,所以中间的Base是已知的依赖,只会在实例化Derived时查找,此时所有的碱基都是完全已知的并且可以被搜索到。

    【讨论】:

    • 非常感谢,和 Storyteller 一样,这种技术非常适合模板代码!
    • @svoltron 相同的评论。
    • 是的,不知道在这种情况下接受哪一个,他们都对,同时回复
    • 我想我必须做这样的事情诶
    • @svoltron 没问题,很高兴我帮了忙。
    【解决方案3】:

    你可以定义一个类型别名:

    template<class T, class V>
    struct Derived : public Base<T,V>
    {
        using BaseClass = Base<T,V>;
        using BaseClass::Base;
    };
    

    using 关键字在 C++ 中具有三种含义。它可以介绍:

    • 一个使用指令
    • 一个使用声明
    • 或类型别名。

    using-directive 的形式为 using namespace please_not_std,并将 please_not_std 命名空间中的任何内容带到当前范围(这是一种简化)。

    using-declaration 的形式为 using Class::name,并将在其他地方定义的名称引入当前范围。

    type alias (C++11) 的形式为 using new_type = existing_type,并定义了一个类型别名。

    【讨论】:

    • 是的,我已经在这样做了,但是打字太多而且容易出错
    • 感谢您的进一步解释
    猜你喜欢
    • 2018-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    • 2023-04-02
    • 1970-01-01
    • 2013-07-02
    • 1970-01-01
    相关资源
    最近更新 更多