首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当无法使用auto和decltype()时如何避免类类型的重复

当无法使用auto和decltype()时如何避免类类型的重复
EN

Stack Overflow用户
提问于 2015-02-08 00:53:16
回答 1查看 163关注 0票数 0

我最近发现了autodecltype()的C++11特性,它们非常优秀,因为它们允许消除大量冗余类型代码。但是,在某些情况下不能使用它们。我主要想问的一个例子是,您是否想声明一个变量,其类型使用的是封闭类类型,直接使用,还是作为模板参数,并且没有初始化表达式(该表达式允许您使用auto)。如果封装类类型是具有多个模板参数的模板类,则这尤其不可取。例如:

代码语言:javascript
复制
template<typename T1, typename T2, typename T3, typename T4, typename T5 > struct S {
    std::map<int,S<T1,T2,T3,T4,T5>*> m1;
    std::map<int,S<T1,T2,T3,T4,T5>*> m2;
    std::map<int,S<T1,T2,T3,T4,T5>*> m3;
    std::map<int,S<T1,T2,T3,T4,T5>*> m4;
    std::map<int,S<T1,T2,T3,T4,T5>*> m5;
};

一个合乎逻辑的解决方案是使用ty胡枝子f:

代码语言:javascript
复制
template<typename T1, typename T2, typename T3, typename T4, typename T5 > struct S {
    typedef S<T1,T2,T3,T4,T5> ThisClass;
    std::map<int,ThisClass*> m1;
    std::map<int,ThisClass*> m2;
    std::map<int,ThisClass*> m3;
    std::map<int,ThisClass*> m4;
    std::map<int,ThisClass*> m5;
};

但是,仍然不希望必须声明一个仅仅重复了封闭类的类型的ty清晰度。

如果您在实例方法中,可以通过推导*this的类型来解决这个问题,尽管必要的代码比我想要的要详细得多:

代码语言:javascript
复制
auto copy(void) {
    typename std::remove_reference<decltype(*this)>::type s = *this;
    // ... do stuff with s ...
    return s;
}

这个解决方案不适用于类范围,因为this是不允许的,而且在实例方法之外也没有意义(编译器抱怨"invalid use of ‘this’ at top level")。

所以,我的问题是,当您不能使用autodecltype()时,当您必须在类定义中使用它时,建议采取什么解决方案来避免循环类类型的重复?是唯一的选择吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-08 00:58:00

如果引用当前实例化,则不需要重复模板参数。

代码语言:javascript
复制
template<typename T1, typename T2, typename T3, typename T4, typename T5 > struct S {
    std::map<int,S*> m1;
    std::map<int,S*> m2;
    std::map<int,S*> m3;
    std::map<int,S*> m4;
    std::map<int,S*> m5;
};

注入的类名S引用当前实例化,在本例中是S<T1, T2, T3, T4, T5>

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28389348

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档