是否可以專門化enum
上的模板函數?枚舉上的C++專用函數
我見過注意here模板函數可以被禁用,如果它不是一個枚舉,但這是可能的,但仍然允許其他類型?下面
我的例子顯示了專業化int
,float
和enum
(它不會編譯,因爲它試圖超載enum
版本,而不是專業的話)。我覺得我失去了一些明顯的東西。
請注意,我在找專門的任何枚舉,而不是僅僅(在本例中EAnEnum
)命名一個
#include <iostream>
enum class EAnEnum
{
Alpha,
Beta,
};
template<typename T>
void MyFunc();
template<>
void MyFunc<int>()
{
std::cout << "Int" << std::endl;
}
template<>
void MyFunc<float>()
{
std::cout << "Float" << std::endl;
}
// MyFunc<Enum>
template<typename T>
typename std::enable_if<std::is_enum<T>::value, void>::type MyFunc()
{
std::cout << "Enum" << std::endl;
}
int main()
{
MyFunc<EAnEnum>();
return 0;
}
您正試圖執行函數模板的部分特化。沒有這種東西 - 你可以做全面的專業化,或超載。一種可能的方法 - 將特定於枚舉的實現放入主模板中,或許使用'static_assert',該類型實際上是一個枚舉。 –
你試圖解決什麼實際問題。不,不是這個問題,但你認爲答案是這種專業化的問題。 –
在一般情況下,功能專業化並不是解決幾乎所有您嘗試解決的問題的最佳方法。總之,將會有更好的方式。解決方案最終變得脆弱和尷尬。描述真正的問題,以另一種方式解決問題。 – Yakk