【问题标题】:Using dependent name in base class name without "typename"在没有“typename”的基类名称中使用依赖名称
【发布时间】:2021-07-10 20:52:42
【问题描述】:

我有一个模板类,它的基类也是一个模板参数化的模板,其中一个外部模板类型参数的类型成员。示例:

template <typename X>
class Adapter : public Generator<typename X::generated_type>{
    using G = typename X::generated_type;
};

这里的X 是具有成员generated_type 的某种类型,我们希望将Generator 子类化为X::generated_type。因为X::generated_type是一个从属名,所以我们在基类名中使用的时候要加上typename前缀。

Adapter的其余定义中,我可以用G代替typename X::generated_type,这样显然方便很多。

有没有办法在基类的名称中也使用G

在实际代码中并没有这么简单;我试图将示例提炼为核心问题。

我唯一能想到的是将G 作为模板参数并创建一个将X::generated_type 作为G 传递的包装器。

【问题讨论】:

    标签: c++ typename


    【解决方案1】:

    一种可能的解决方案是作弊,大致如下:

    template <typename X, typename G=typename X::generated_type>
    class Adapter : public Generator<G>{
       // ...
    };
    

    你快到了,进入一个额外的模板参数领域,但你不需要显式传递它,只需默认它。

    完整示例:

    template<typename> class Generator {};
    
    template <typename X, typename G=typename X::generated_type>
        class Adapter : public Generator<G>{
           // ...
        };
    
    struct Y {
        typedef int generated_type;
    };
    
    int main()
    {
        Adapter<Y> a;
    
        return 0;
    }
    

    【讨论】:

    • 我以为我试过了,但也许我做得不对,只是认为它不起作用。
    • 好的,它确实有效!谢谢,这就是我想要的。
    • 我还不能接受你的回答,请稍等。
    • 另一种方式是为生成器提供该类型,或具有类型特征类
    • 通过让Generator 提供类型,我假设您的意思是Generator 中的typedefusing 公开G。但我不认为这有助于避免在声明 Generator 基类时使用 typename
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-06
    相关资源
    最近更新 更多