我想通過刪除接受不關心成員的特殊化(通過enable_if),根據成員的「類型」自動選擇正確的指向成員的指針。未被enable_if排除的不明確的模板參數
我有以下代碼:
class test;
enum Type
{
INT_1,
FLOAT_1,
UINT_1,
CHAR_1,
BOOL_1,
INT_2,
FLOAT_2,
UINT_2,
CHAR_2,
BOOL_2
};
template<typename T, Type Et, typename func> struct SetterOk { static const bool value = false; };
template<typename T> struct SetterOk<T,INT_1,void (T::*)(int)> { static const bool value = true; };
template<typename T> struct SetterOk<T,FLOAT_1,void (T::*)(float)> { static const bool value = true; };
template<typename T> struct SetterOk<T,UINT_1,void (T::*)(unsigned int)> { static const bool value = true; };
template<typename T> struct SetterOk<T,CHAR_1,void (T::*)(char)> { static const bool value = true; };
template<typename T> struct SetterOk<T,BOOL_1,void (T::*)(bool)> { static const bool value = true; };
template<typename T> struct SetterOk<T,INT_2,void (T::*)(int,int)> { static const bool value = true; };
template<typename T> struct SetterOk<T,FLOAT_2,void (T::*)(float,float)> { static const bool value = true; };
template<typename T> struct SetterOk<T,UINT_2,void (T::*)(unsigned int, unsigned int)> { static const bool value = true; };
template<typename T> struct SetterOk<T,CHAR_2,void (T::*)(char,char)> { static const bool value = true; };
template<typename T> struct SetterOk<T,BOOL_2,void (T::*)(bool,bool)> { static const bool value = true; };
template <bool, class T = void> struct enable_if {};
template <class T> struct enable_if<true, T> { typedef T type; };
template<typename T, Type Et>
struct Helper
{
template<typename U>
static void func(U method, typename enable_if<SetterOk<T,Et,U>::value>::type* dummy = 0)
{
}
};
class test
{
public:
void init()
{
Helper<test,INT_2>::func(&test::set);
}
void set2(int);
void set(int);
void set(int,int);
void set(float,float);
};
int main()
{
test t;
t.init();
return 0;
}
我期待它來選擇所有可能的正確的函數。問題是編譯器說「不能推導出模板參數,因爲函數參數不明確」。
看來,我不知道如何使用enable_if,因爲如果這樣,編譯器將只允許專門如果指定的函數具有正確的類型......
注意,我想有C++ 03解決方案(如果可能的話) - 我的代碼必須在一些舊的編譯器上編譯。
在此先感謝
編譯器只是簡單地不知道哪個集合重載選擇甚至開始實例化處理 – PlasmaHH 2012-03-15 16:33:45
我想我已經找到了一個替代解決方案來解決你的問題。請檢查我的答案。 – Agentlien 2012-03-15 17:39:31