2016-02-09 53 views
1

我正在使用boost融合庫來識別結構中的所有成員。 IdentityNamespace::SomeClass的成員。通過一些遞歸操作,v最終將成爲Namespace::SomeClass對象。在輸入if聲明之後,我希望能夠處理SomeClass的成員對象。如何在模板東西中處理成員變量

template<typename T> 
void Function(T const& v) 
{ 
    typedef boost::mpl::range_c<unsigned, 0, boost::fusion::result_of::size<T>::value > T_members; 
    boost::fusion::for_each(T_members(), FunctionStruct<T>(v)); 

    if (std::is_same<T, Namespace::SomeClass>::value) 
    { 
     v.Identity= "0"; 
    } 
} 

當我編譯這段代碼,它給了我一個C2039錯誤,即

「身份」:是不是「命名空間:: OtherClass」中的一員。

因爲我只是處理成員identity當v是​​,Identity不必是OtherClass成員。我應該如何編寫我的代碼來避免這種編譯錯誤?

謝謝!不管事實檢查

if (std::is_same<T, Namespace::SomeClass>::value) 

是一個編譯時間常數

回答

3

,編譯器仍然有編譯所有在函數的代碼。如果Identity只是T的成員(如果該檢查爲真),那麼如果該檢查失敗,則顯然將無法編譯。您必須將其移到不同的功能中。對於最簡單的方法是標籤調度:

zero_out(v, std::is_same<T, Namespace::SomeClass>{}); 

有:

template <class T> 
void zero_out(T const& v, std::true_type) { 
    v.Identity = 0; 
} 

template <class T> 
void zero_out(T const& v, std::false_type) { 
    // nothing ? 
} 

或在這種情況下,因爲我們正在檢查特定類型的,甚至不需要標籤調度,可以只提供一個非模板超載:

zero_out(v); 

template <class T> 
void zero_out(T const&) { } 

void zero_out(Namespace::SomeClass const& v) { 
    v.Identity = 0; 
} 

側面說明,你在一個const引用分配的成員?

+0

@XTT不,但這不是一個最小的,完整的或可驗證的例子,所以我不知道。 – Barry

+0

第一種方法奏效!謝謝 – XTT