cppreference.com(http://en.cppreference.com/w/cpp/types/enable_if#Notes)指出:使用模板,如何區分兩個並行的情況,例如浮點類型和整型之間的區別?
一個常見的錯誤是隻聲明在其默認模板參數的不同的兩個函數模板。這是非法的,因爲默認模板參數不是函數模板簽名的一部分,並且聲明具有相同簽名的兩個不同函數模板是非法的。
struct T { enum { int_t,float_t } m_type; template <typename Integer, typename = std::enable_if_t<std::is_integral<Integer>::value> > T(Integer) : m_type(int_t) {} template <typename Floating, typename = std::enable_if_t<std::is_floating_point<Floating>::value> > T(Floating) : m_type(float_t) {} // error: cannot overload };
所以真的...那麼,什麼是解決這個問題,真正實現上面有哪些不正確的代碼無法實現正確的做法?
這似乎很尷尬,如果每次調用某個方法時,都必須手動傳遞一個標籤,告訴C++「float」是一個浮點類型,而「int」是一個整型...不是更好嗎讓C++自己來分析它? – gaazkam
@gaazkam嗯,這是一個建立在C++中的非常靈活的習慣用法(只需查看'iterator_traits')。例如,如果您將標記構建爲層次結構(可以爲「random_iterator_tag」和「bidirectional_iterator_tag」提供重載),則可以使用重載解析機制來選擇想要的重載,並選擇回退到更通用的重載。 )。如果你想支持另一組類型,那麼擴展這種方法比使用ifs的嵌套容易得多。 – krzaq