我正在試驗C++ 11的新功能。在我的設置中,我真的很喜歡使用繼承構造函數,但不幸的是沒有編譯器實現這些。因此我試圖模擬相同的行爲。我可以寫這樣的東西:檢測受保護的構造函數(可能是抽象的)基類
template <class T>
class Wrapper : public T {
public:
template <typename... As>
Wrapper(As && ... as) : T { std::forward<As>(as)... } { }
// ... nice additions to T ...
};
這個工程...大部分時間。有時使用類的代碼必須使用SFINAE來檢測如何構建這樣的Wrapper<T>
。然而,存在以下問題:就重載解析而言,Wrapper<T>
的構造函數將接受任何參數 - 但如果不能使用這些參數構造T
,則編譯失敗(並且這是而非由SFINAE覆蓋)。
我試圖用enable_if
template <typename... As, typename std::enable_if<std::is_constructible<T, As && ...>::value, int>::type = 0>
Wrapper(As && ... as) // ...
其中只要正常工作條件使構造模板的不同實例:
- 的
T
適當的構造函數是public
T
不是抽象的
我的問題是:如何擺脫上述兩個約束?
我試圖克服所述第一通過檢查(使用SFINAE和sizeof()
)是否表達new T(std::declval<As &&>()...)
被內Wrapper<T>
合式。但是,這當然不起作用,因爲派生類可以使用其基類的受保護構造函數的唯一方式是在成員初始化列表中。
對於第二個,我不知道 - 這是我需要更多,因爲有時它是Wrapper
,它實現了T
的抽象函數,使它成爲一個完整的類型。
我想的溶液,其中:。根據在任何GCC-4.6的標準
- 是正確*,GCC-4.7 *或鐺-3 *
謝謝!
我很忙,但也許http://stackoverflow.com/questions/8984013/can-sfinae-detect-private-access-violations可以在這裏幫助,我不會指望gcc 4.6正確雖然 – PlasmaHH
訪問控制在這裏有點棘手:如果使用'sizeof()',編譯器將檢查整個表達式,包括訪問 - 但是然後從表達式**的上下文中檢查訪問**,這會失敗受保護的構造函數;除了'sizeof'之外的所有東西都只能在重載解析和類型推斷的層面上工作,所以訪問衝突不會觸發SFINAE - 但是,我看不出用構造函數做什麼,因爲它不能作爲模板參數傳遞。至於編譯器支持,如果上面的任何**接受代碼,我會很高興。 –