2015-10-20 44 views
5

我想寫一個宏,它在類中展開時使用該類類型(特別是作爲模板參數)。在類的方法,我可以用這個:C++ - 有沒有辦法獲得當前類類型不變的語法?

#define METHOD_MACRO int sample_method(void)const {\ 
    return template_struct<this_type<decltype(this)>::type>::index;} 

(this_type是我的結構,這是相當於remove_pointer<remove_const<T>>

但是,當我需要的類類型的方法之外(typedef的類成員指針) this關鍵字不可用;我試圖用auto來推斷類型的一些技巧,但這裏沒有運氣。 有問題的類從我的類繼承,如果這可以有任何幫助。我想避免任何人使用我的宏必須編寫強制性typdedef

任何想法?

+2

使用CRTP?也許你可以完全消除宏... –

+0

這需要用戶的明確努力,我儘量避免。有趣的想法,但不是那裏。 – Abstraction

+1

@Abstraction輸入你的宏的名字需要用戶從CRTP類的繼承中獲得儘可能多的努力:) – Drax

回答

4

您可以使用下面的訣竅:

#define SELF \ 
    static auto helper() -> std::remove_reference<decltype(*this)>::type; \ 
    typedef decltype(helper()) self 

struct A { 
    SELF; 
}; 

我宣佈使用auto返回類型的輔助功能,它允許我使用decltype(*this)作爲返回類型,不知道什麼是類名。然後我可以使用decltype(helper())在代碼中使用類的類型。請注意,該功能必須是static,否則您不能在decltype中使用它。此外,該功能只是聲明,沒有定義;這不應該成爲一個問題,因爲你無論如何都不會去調用它。 (您可以將空體添加到它,但它會提高一個函數沒有return警告。不過,你可以改變返回類型爲decltype(this),並返回nullptr。)

然後你可以使用self的typedef進一步的聲明,或者只是改變宏以便typedef不是類本身,而是你需要的。調整它以適應您的特殊需求。

UPD:這似乎是GCC的非標準行爲。例如,即使在追蹤返回類型中,ICC也不允許在static函數中使用this

+2

爲什麼你可以在這種情況下使用'this'? –

+0

@ n.m。,爲什麼我不能?我不是這個標準的專家,但是我粗略的理解是'this'只是一個隱含的函數參數,我可以用'auto'在返回類型中使用函數參數。它確實有效:http://coliru.stacked-crooked.com/a/9af8022707a13ff6 – Petr

+0

@n.m。,儘管我在'static'函數中使用'this'確實很奇怪。最初試圖使它成爲一個非靜態的,添加'靜態'來使'decltype(helper())'工作,並沒有意識到'decltype(* this)'可能會中斷。無論如何,它的作品。不要說它是GCC的bug :) – Petr

相關問題