2013-11-26 27 views
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 

回答

1

你舉的例子是非法的構造:

3.3.7/1下列規則描述名稱的申報範圍在課堂上。

  1. 在一個類中聲明的名稱的潛在範圍不僅包括以下 名稱的點聲明的聲明區,但所有的函數體的非靜態 大括號或相等,初始化的還數據成員以及該類中的默認參數(包括嵌套類中的這些內容)。
  2. 在類S中使用的名稱N應在其上下文中指示同一聲明,並在 中重新評估S的完整範圍。違反此規則時不需要診斷。
  3. 如果對類中的成員聲明進行重新排序以產生(1)和(2)下的替代有效程序,則 程序不合格,不需要進行診斷。

你的方法依賴於在嵌套類定義不同的點指的是不同的東西的名稱NextOuterClass。這正是(2)所禁止的。

+0

我意識到這是比評論更多的評論,但是這個解釋需要太多的文字才能適合評論。 –