我有兩個列舉如下:
enum TTT {t = 2};
enum XXX {x = 2};
我正在嘗試制作一些結構來幫助我獲得列舉的名稱。這是我所做的:
template<TTT>
struct StrMyEnum {
static char const* name() { return "unknown"; }
};
template<>
struct StrMyEnum<t> {
static char const* name() { return "tt"; }
};
有用。現在我可以得到列舉的名稱t:StrMyEnum<t>::name()。
但是,如果我為 撰寫另一組模板結構XXX,它似乎不起作用。
template<XXX>
struct StrMyEnum {
static char const* name() { return "unknown"; }
};
template<>
struct StrMyEnum<x> {
static char const* name() { return "xx"; }
};
現在我得到一個編譯錯誤:could not convert 'x' from 'XXX' to 'TTT'. 似乎編譯器正在嘗試StrMyEnum<x>與TTT...匹配
我不知道為什么。
所以模板不能區分不同的列舉?是否可以為不同的列舉撰寫一些結構?
uj5u.com熱心網友回復:
您可以使用 C 17 非型別模板引數并對 and 進行部分特化t,x因為它們實際上是不同的型別
enum TTT { t = 2 };
enum XXX { x = 2 };
template<auto>
struct StrMyEnum {
static char const* name() { return "unknown"; }
};
template<>
struct StrMyEnum<t> {
static char const* name() { return "tt"; }
};
template<>
struct StrMyEnum<x> {
static char const* name() { return "xx"; }
};
演示
uj5u.com熱心網友回復:
StrMyEnum標識模板的名稱。
您可以對其進行一般宣告,然后進行一些專業化。
但是你不能有第二組宣告 專業化(就像你對 set for 所做的那樣XXX)。
您可以做的是使用列舉型別和列舉值引數化一個模板。然后,您可以擁有 2 個專業級別:
- 對于特定列舉的特定值。
- 特定列舉的默認值。
請看下面的代碼:
#include <iostream>
enum TTT { t = 2, t2 = 3 };
enum XXX { x = 2, x2 = 3 };
template <typename T, T val>
struct StrMyEnum {
static char const* name() { return "unknown"; }
};
// Default specialization for TTT:
template <TTT t>
struct StrMyEnum<TTT, t> {
static char const* name() { return "TTT"; }
};
// Specialization for TTT::t:
template <>
struct StrMyEnum<TTT, t> {
static char const* name() { return "TTT::t"; }
};
// Specialization for XXX::x:
template <>
struct StrMyEnum<XXX, x> {
static char const* name() { return "XXX::x"; }
};
int main()
{
std::cout << StrMyEnum<TTT, t2>().name() << std::endl;
std::cout << StrMyEnum<TTT, t>().name() << std::endl;
std::cout << StrMyEnum<XXX, x2>().name() << std::endl;
std::cout << StrMyEnum<XXX, x>().name() << std::endl;
return 0;
}
輸出:
TTT
TTT::t
unknown
XXX::x
演示:https ://godbolt.org/z/zW547T9nf 。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/480878.html
