3

我與指針到成員類型模板內的工作,目前我有事情是這樣的:帶有指向成員模板參數指針的隱含類型?

template <typename Base, typename Type, Type Base::* Var> 
struct Member 
{ 
    //Stuff goes here. 
}; 

但不必定義基地,類型,然後VAR,似乎有點多餘,因爲基本和類型隱含在Var的類型中。

有沒有辦法做到這一點,這樣,當使用/調用成員結構,它只需要使用單個指針成員參數?理論上,像這樣的東西:

template <typename Base, typename Type, Type Base::* Var> 
struct Member<Var> 
{ 
    //stuff goes here 
}; 

struct S 
{ 
    int memberVal; 
}; 

int main() 
{ 
    Member<&S::memberVal> example; 
}; 

感謝您的幫助!

回答

1

沒辦法。只有你的第一個變體是正確的。你正在給C++ cyntax不那麼優雅的例子。它是它的樣子。

你的第二個例子有模板專業化的語法。雖然它是一個新模板的定義。這很可能會成爲反對意見。

+0

從理論上講,它是否可以添加到C++標準中,或者是否存在一些邏輯缺陷或謬誤,從理論上來說會妨礙這一點? – Serge 2012-08-08 04:04:21

+0

我沒有看到你提議的缺陷。另一方面,模板已經被覆蓋。這是不太可能的。 Presonally在添加此功能時看不到「重大」收益。順便說一下,每個人都可以提出改變。 C++委員會非常民主。 – 2012-08-08 04:07:05

+0

正確;然而,儘管它很小,但在極少數情況下可能會出現,它可以節省大量的樣板代碼。我認爲這個建議總的來說就是在模板參數列表中隱含類型常量......這是我在2天內發現的第二個「C++不穩定性」問題......昨天,它是缺少指向成員成員的問題。 – Serge 2012-08-08 04:13:56

1

你所要求的不能直接在C++中實現。限制是對於非類型模板參數,類型必須在模板定義中提供。類型推導僅適用於函數參數。

根據您的實際使用情況,可以完成其他選擇,但它們意味着將成員指針從模板參數(編譯時間)移動到函數參數(運行時)。也就是說,給定一個類型:

template <typename C, typename M> 
struct Member { 
    M C::*ptr; 
    Member(M C::*ptr) : ptr(ptr) {} 
}; 

它可以創建它的實例的語法:

auto x = create_member(&S::memberVal); 

通過使用幾元編程技巧,不會太複雜,但:

template <typename T> struct MemberType; 
template <typename T, typename M> 
struct MemberType<M T::*> { 
    typedef Member<T,M> type; 
}; 
template <typename T> 
typename MemberType<T>::type 
create_member(T mbrptr) { 
    typename MemberType::type r(mbrptr); 
    return r; 
} 

但正如我已經提到的那樣,這意味着將編譯時參數轉換爲運行時參數,從而可能會禁止編譯器將執行的一些優化(即內聯)。

+0

啊,元編程。也許這是我最喜歡的關於C++的東西之一! – Serge 2012-08-08 13:59:31