的模板專業化,我專門爲我的類型std::common_type
。我定義了以下專業化:接受所有版本的const/volatile資格和&vs &&
common_type<my_type, my_type>
而且一切都很好。然後有人來,並呼籲std::common_type<my_type, my_type &>
。如果您傳遞引用而不是引用(因爲它在類型上調用std::decay
),默認版本的作用相同。但是,它不會推遲到std::common_type
的非參考版本,我需要正確工作。難道還有比不得不做這樣的事情(留出右值引用爲const爲簡單起見)更好的方式:
common_type<my_type, my_type>
common_type<my_type, my_type &>
common_type<my_type, my_type const &>
common_type<my_type, my_type volatile &>
common_type<my_type, my_type const volatile &>
common_type<my_type, my_type &&>
common_type<my_type, my_type volatile &&>
common_type<my_type &, my_type>
common_type<my_type const &, my_type>
common_type<my_type volatile &, my_type>
common_type<my_type const volatile &, my_type>
common_type<my_type &&, my_type>
common_type<my_type volatile &&, my_type>
common_type<my_type &, my_type &>
common_type<my_type &, my_type const &>
common_type<my_type &, my_type volatile &>
...
肯定有更好的辦法?據我統計,這是49個可能版本,如果我們忽略const &&
和const volatile &&
注:my_type實際上是一類模板本身,所以在specialize實際上看起來更像
template<intmax_t lhs_min, intmax_t lhs_max, intmax_t rhs_min, intmax_t rhs_max>
class common_type<my_type<lhs_min, lhs_max>, my_type<rhs_min, rhs_max>>
其結果爲my_type<min(lhs_min, rhs_min), max(lhs_max, rhs_max)>
如果我完全控制主模板定義,解決方案將非常簡單,但我顯然無法更改std::common_type
。
你看過你的標準庫的'std :: common_type'實現了嗎? – Casey
這裏的實現沒有太大的自由。它必須調用'std :: decay'(或者有一個實現與這樣做不可區分)。果然,這就是gcc 4.8.2所做的那樣 –
它暗含着某種暗示,但只是爲了確保:你不能使用與「std :: common_type」不同的東西,即改變「call site」?你不能定義SFINAE保護的轉換運算符模板來執行'my_type'「自然」嗎? –
dyp