是否可以專門爲枚舉模板化方法?枚舉模板專精
喜歡的東西(以下無效代碼):
template <typename T>
void f(T value);
template <>
void f<enum T>(T value);
在這是不可能的話,那麼假設我有專業化的多種類型,如int
,unsigned int
,long long
,unsigned long long
,等等,然後枚舉值將使用哪些專門化?
是否可以專門爲枚舉模板化方法?枚舉模板專精
喜歡的東西(以下無效代碼):
template <typename T>
void f(T value);
template <>
void f<enum T>(T value);
在這是不可能的話,那麼假設我有專業化的多種類型,如int
,unsigned int
,long long
,unsigned long long
,等等,然後枚舉值將使用哪些專門化?
您可以使用std::enable_if
和std::is_enum
來自<type_traits>
來完成此操作。
In an answer to one of my questions,litb發佈了很關於如何使用Boost等價物可以完成的詳細和詳細的說明。
這看起來就像它可能工作。我正在看看它。謝謝! – nilton
我不知道如果我正確地理解你的問題,但你可以實例化具體枚舉模板:
template <typename T>
void f(T value);
enum cars { ford, volvo, saab, subaru, toyota };
enum colors { red, black, green, blue };
template <>
void f<cars>(cars) { }
template <>
void f<colors>(colors) { }
int main() {
f(ford);
f(red);
}
這不起作用,因爲我事先沒有枚舉類型。 – nilton
在C++ 11中,您有類型,因此您可以創建枚舉模板。一個更好的主題是根據枚舉的特定值創建模板(f
想必,你可以用一個類型,他們唯一的事情你做的唯一有趣的事情知道它是一個枚舉,將它投射到它的基本類型並對其進行操作。以下是如何可能的樣子,用詹姆斯的建議的方法(AKA SFINAE):
void Bar(int b); // and/or other underlying types
template<typename T>
typename std::enable_if<std::is_enum<T>::value, void>::type
Foo(T enm)
{
Bar(static_cast<typename std::underlying_type<T>::type>(enm));
}
作爲一個相關的獎金,這裏有一個類似的方法,只會得到解決特定類型的選擇的(在is_same
替換布爾您選擇的類型):
template<typename T>
typename std::enable_if<std::is_same<T,bool>::value, void>::type
Baz(T bl)
{
if (bl)
{
//...
}
else
{
//...
}
}
http://stackoverflow.com/questions/29762892/how-to-specialize-a-template-function-for-enum-and-specific-type –