当不能使用auto和decltype()时,如何避免封闭类类型的重复



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

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

一个合理的解决方案是使用typedef:

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

但是,必须声明一个只重复封闭类的类型的typedef仍然是不可取的。

如果你在一个实例方法中,通过推导*this的类型,这实际上可以解决,尽管必要的代码比我想要的更详细:

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()时,当您必须在类定义中使用封闭类的类型时,建议使用什么解决方案来避免重复它?typedef是唯一的选择吗?

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

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>

最新更新