Expression SFINAE是一種非常方便的方式來編寫幾個替代功能來做同樣的事情,並選擇最好的編譯。你在函數原型中提到了關鍵表達式,如果它們是無效的,原型將被忽略,並且希望能夠挑選出另一個。表達式中的習慣性表達sfinae
這是非常方便的,除了在表達式未定義的情況下聲明原型。通常這組原型必須分成互斥域,因爲它們在重載分辨率方面可能是相等的,並且允許兩個進入重載集會造成模糊性。
人們總是可以定義爲一個給定的表達std::enable_if
老式的特質類型,用途:
template< typename s, typename t, typename u, typename = void >
struct is_product_serializable : std::false_type {};
template< typename s, typename t, typename u >
struct is_product_serializable< s, t, u, typename std::conditional< true, void,
decltype(std::declval<s>() << std::declval<t>() * std::declval<u>())
>::type >
: std::true_type {};
如果不是因爲需要的東西從false_type
派生的std::conditional
可以去直接進入函數原型,所有這些樣板都會消失。
有沒有其他的選擇?也許有一種方法可以減少不影響類型扣除的函數重載的排名?
我還沒有完全明白這個問題。你爲什麼不能把這些條件放在函數原型上?你說「如果不是需要從'false_type'派生':爲什麼需要?如果你想使用標籤調度,那就只是這種情況,但你並不是被迫的。爲什麼你不能在函數原型中使用類型名稱enable_if> :: type'?也許我還沒有理解你的想法。 –
2013-02-20 02:38:48
@AndyProwl你命名了一個條件。那麼相反的情況呢? – Potatoswatter 2013-02-20 03:33:19