0
我注意到OuterClass上的手動指定typedef代價過高,有時會導致令人尷尬的錯誤。 所以我決定在OuterClass上做一個複製貼友好的typedef。 這是我的了:如何在C++ 11中爲OuterClass製作複製粘貼友好的typedef?
#include <type_traits>
struct A{
typedef A NextOuterClass;
typedef A SelfClass;
struct B{
typedef NextOuterClass OuterClass;
typedef B NextOuterClass;
typedef B SelfClass;
struct C{
typedef NextOuterClass OuterClass;
typedef C NextOuterClass;
typedef C SelfClass;
};
};
};
#define CHECK(OWNER,TYPE)\
static_assert(\
std::is_same<OWNER::TYPE::OuterClass,OWNER>::value,\
#OWNER"::"#TYPE" - not ok"\
);
CHECK(A,B);
CHECK(A::B,C);
#undef CHECK
int main(){return 0;}
它工作的很好,但並非總是如此:
#include <type_traits>
struct I{
typedef I NextOuterClass;
typedef I SelfClass;
};
struct D{
typedef D NextOuterClass;
typedef D SelfClass;
struct E:public I{
typedef NextOuterClass OuterClass; // NextOuterClass == I::NextOuterClass
typedef E NextOuterClass;
typedef E SelfClass;
typedef I ParentClass;
};
};
#define CHECK(OWNER,TYPE)\
static_assert(\
std::is_same<OWNER::TYPE::OuterClass,OWNER>::value,\
#OWNER"::"#TYPE" - not ok"\
);
CHECK(D,E); // D::E - not ok
#undef CHECK
int main(){return 0;}
如果我刪除「的typedef我NextOuterClass;」,那麼它會工作,但它是一個壞因爲決策類的「我」也可能有子類:
#include <type_traits>
struct I{
typedef I NextOuterClass;
typedef I SelfClass;
struct G{
typedef NextOuterClass OuterClass;
typedef G NextOuterClass;
typedef G SelfClass;
};
};
struct D{
typedef D NextOuterClass;
typedef D SelfClass;
struct E:public I{
typedef NextOuterClass OuterClass; // NextOuterClass == I::NextOuterClass
typedef E NextOuterClass;
typedef E SelfClass;
typedef I ParentClass;
};
};
#define CHECK(OWNER,TYPE)\
static_assert(\
std::is_same<OWNER::TYPE::OuterClass,OWNER>::value,\
#OWNER"::"#TYPE" - not ok"\
);
CHECK(I,G);
CHECK(D,E); // D::E - not ok
#undef CHECK
int main(){return 0;}
我曾試圖利用的「私人」和「模板」,但仍然沒有達到所期望的行爲特徵。
在C++ 11或C++ 14中有沒有可靠的方法來查找OuterClass?
這將是很好,這裏有這樣的事情:
std::get_outer_class<T>::type
std::is_nested_class<T>::value
我意識到這是比評論更多的評論,但是這個解釋需要太多的文字才能適合評論。 –