2016-09-13 28 views
1

所以我試圖在具有轉換操作符爲bool類型限制操作 - 例如:用的時候都使用編譯時消息刪除功能

template <typename R> 
Result 
operator&&(const R&) { 
    STATIC_ASSERT(false, MY_MESSAGE); 
    return Result(); 
} 

STATIC_ASSERT約爲Ç我的包裝的宏++ 11 static_assert和一個宏 - ish C++ 98靜態斷言。

我想要一個有點有用的消息作爲錯誤的用戶嘗試使用這個,使其私人或在C + + 11刪除它不是一個選項。

但是,由於msvc和g ++/clang之間的差異,只適用於MSVC - 即使未使用「已刪除」函數,g ++/clang靜態斷言也會始終激活。

我見過的唯一的東西,會做的伎倆是用它的名字作爲消息爲模板的返回類型使用一個未定義的類型 - 這樣的:

template<typename R> 
STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& 
operator&&(const R&); 

我第一次看到這個here

是否有任何其他方式來做到這一點在c + + 98中 - 用戶嘗試使用它時自定義消息的刪除函數?

+0

@HansPassant謝謝。 (這是關於[>這個<](http://stackoverflow.com/questions/39479163)問題) – onqtam

回答

1

in static_assert(false, message)false不依賴於模板。

你必須使你的條件取決於模板。

as static_assert(!std::is_same<T, T>::value, message)

+0

謝謝!其實我只是意識到同樣的事情,並提出了我自己的解決方案 - '''模板 struct deferred_false {static const bool value = false; };'''我將'''deferred_false :: value''傳遞給靜態斷言! – onqtam

相關問題