我的類的成員方法之一是作爲枚舉類型的參數:它爲不同的枚舉產生不同的副作用。我想知道是否有可能使用模板作爲一個查找表,兩個可能的解決方案,到了我的心,但他們都不似乎工作:具有不同修飾類型的實例化模板
//// 1 ////
class A {
public:
enum AEnum : uint8_t { first, second, ... };
private:
template<AEnum N, typename T>
struct impl {
static void do_sth(T t) { ... };
};
template<typename T>
struct impl<first, T> {
static void do_sth(T t) { ... };
};
public:
template<typename T>
void do_sth(AEnum e, T t) {
impl<e, T>::do_sth(t);
}
}
//// 2 ////
class A {
public:
enum AEnum : uint8_t { first, second, ... };
private:
template<typename T_enum, typename T>
struct impl {
static void do_sth(T t) { ... };
};
template<typename T>
struct impl<uint8_t[2], T> { // A::first
static void do_sth(T t) { ... };
};
public:
template<typename T>
void do_sth(AEnum e, T t) {
impl<uint8_t[static_cast<uint8_t>(e) + 1u], T>::do_sth(t);
}
}
是不是真的壞主意,這樣的代碼呢?
@Oli查爾斯沃思
有什麼不對switch語句?
do_sth的第二個參數(T)的受支持類型隨e的值而變化,例如, A :: first支持積分和A :: second STL容器,例如:
template<typename T>
void do_sth(AEnum e, T t) {
switch(e) {
case first:
std::cout << &t << std::endl;
break;
case second:
std::cout << t.data() << std::endl;
break;
default:
break;
}
A a;
a.do_sth(A::first, 0);
所以,如果e在運行時是第二,t是int,會發生什麼?似乎任何選擇都可以在編譯時發生,在這種情況下,根本不清楚枚舉是什麼。 – UncleBens 2010-09-03 23:23:44
t在運行時不可能是int類型的,因爲它甚至不會編譯。我發現在相關的sfinae,認爲它應該做的伎倆。 – erjot 2010-09-04 11:25:48