在没有 "typename" 的基础 class 名称中使用从属名称

Using dependent name in base class name without "typename"

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

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

这里 X 是一个有成员 generated_type 的类型,我们想为 X::generated_type 子 class 一个 Generator。因为 X::generated_type 是从属名称,所以我们在基础 class 名称中使用它时,必须在它前面加上 typename 前缀。

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

有没有办法在基地class的名字中也使用G

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

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

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

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;
}