我最近发现了auto和decltype()的C++11特性,它们非常优秀,因为它们允许消除大量冗余类型代码。但是,在某些情况下不能使用它们。我主要想问的一个例子是,您是否想声明一个变量,其类型使用的是封闭类类型,直接使用,还是作为模板参数,并且没有初始化表达式(该表达式允许您使用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;
};一个合乎逻辑的解决方案是使用ty胡枝子f:
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的类型来解决这个问题,尽管必要的代码比我想要的要详细得多:
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")。
所以,我的问题是,当您不能使用auto或decltype()时,当您必须在类定义中使用它时,建议采取什么解决方案来避免循环类类型的重复?是唯一的选择吗?
发布于 2015-02-08 00:58:00
如果引用当前实例化,则不需要重复模板参数。
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>。
https://stackoverflow.com/questions/28389348
复制相似问题