bgo*_*dst 0 c++ generic-programming
我最近发现了C++ 11的优点auto和decltype()特性,它们非常出色,因为它们可以消除大量的冗余类型代码.但是,有些情况下它们无法使用.我主要询问的一个例子是,如果你想要声明一个类型使用封闭类类型的变量,可以是直接的,也可以是模板参数,并且你没有初始化表达式(允许你使用它)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;
};
Run Code Online (Sandbox Code Playgroud)
逻辑解决方案是使用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;
};
Run Code Online (Sandbox Code Playgroud)
但是仍然不希望声明一个只重复封闭类类型的typedef.
如果您在实例方法中,通过推导类型,实际上可以解决这个问题*this,尽管必要的代码比我想要的更详细:
auto copy(void) {
typename std::remove_reference<decltype(*this)>::type s = *this;
// ... do stuff with s ...
return s;
}
Run Code Online (Sandbox Code Playgroud)
此解决方案在类范围内不起作用,因为this不允许,并且在实例方法之外没有意义(编译器抱怨"invalid use of ‘this’ at top level").
所以,我的问题是,当你不能使用auto或者decltype(),当你必须在类定义中使用它时,建议什么是避免重复封闭类的类型?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;
};
Run Code Online (Sandbox Code Playgroud)
该注入的类名 S是指当前实例,在这种情况下S<T1, T2, T3, T4, T5>.
| 归档时间: |
|
| 查看次数: |
129 次 |
| 最近记录: |