C++ 模板基类函数成员的别名
我正在编写使用大量模板的代码,我经常会遇到如下代码:C++ 模板基类函数成员的别名,c++,templates,syntax,variadic-templates,template-meta-programming,C++,Templates,Syntax,Variadic Templates,Template Meta Programming,我正在编写使用大量模板的代码,我经常会遇到如下代码: 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
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
};
模板
结构基{Base(inta){};
模板
结构派生:公共基
{
使用Base::Base;//[1]好的,它可以工作
使用Base::Base;//[2]不起作用
};
想想看,如果你写的不是更有意义的名字,那么[1]语句就太长了。。没有办法使用像[2]这样的语句吗?或者在即将到来的C++标准中有什么可以简化这一点吗?< p>可以用:定义类型别名。
template<class T, class V>
struct Derived : public Base<T,V>
{
using BaseClass = Base<T,V>;
using BaseClass::Base;
};
模板
结构派生:公共基
{
使用BaseClass=Base;
使用BaseClass::Base;
};
<>代码>使用关键字在C++中有三个含义。它可以介绍:
- 使用指令
- 使用声明
- 或类型别名
使用名称空间please\u not\u std
,并将please\u not\u std
名称空间中的任何内容带到当前范围(这是一种简化)
A的形式为using Class::name
,并在当前范围的其他地方引入了一个定义的名称
A的形式为
使用新类型=现有类型
,并定义。。。类型别名。仅使用Base::Base
的问题是名称Base
(在左侧)应该是父Base
的注入类名,但由于父类是依赖的,因此不会搜索名称,因此也不会找到注入的类名
您可以通过在依赖上下文中使用注入的类名来解决这个问题,以便将其查找推迟到实例化。像这样:
template<class T, class V>
struct Derived : public Base<T,V>
{
using Derived::Base::Base;
};
模板
结构派生:公共基
{
使用派生::Base::Base;
};
<代码>派生通常被发现(它是这个实例化注入的类名),并且已知是依赖的,因此中间的
中拾取第一个using base::base
的非限定查找找到base
template<class T, class V>
struct Derived : public Base<T,V>
{
using Derived::Base::Base;
};
模板
结构派生:公共基
{
使用派生::Base::Base;
};
Derived
是Derived
的注入类名。我们发现了,现在我们正在对Base
进行限定查找,因此依赖性不再是一个问题。是的,我已经在这样做了,但是输入太多,错误太多了。请进一步解释。这太棒了,这正是我要找的!你在哪里学的这些东西?@svoltron那么,如果是这样,请点击答案分数下的复选标记,接受讲故事人的答案;)@svoltron-回答语言律师的问题,并在我自己的代码中跌跌撞撞地进入语言的这些黑暗角落。我从来没有真正面对过你的具体问题,但这种情况在我的脑海中闪现。好吧,你应该为此感到骄傲,然后非常感谢你,对Storyteller来说也是一样,这种技术对于模板代码来说太棒了@svoltron同样的评论。是的,不确定在这种情况下接受哪一个,他们都是对的,同时回答我想我必须这样做eheh@svoltron没问题,很高兴我帮了忙。