在没有 "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;
}
我有一个模板 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;
}