2013-04-25 264 views
2

我有一個類:轉換類型爲int(C :: *)(INT,CHAR)爲int類型(INT,CHAR)

struct C { 
    int F(int, char) { return 0; } 
}; 

,我需要創建一個std::function,它會調用C::F一個變量c功能:

C c; 
std::function<int(int, char)> f; 
... 
f = std::bind(&C::F, &c, _1, _2); 

但如果函數的簽名被改變,我需要改變的std ::功能以及。

,所以我想不重複簽名:

C c; 
std::function<delete_class<decltype(&C::F)>::type> f; 
... 
f = std::bind(&C::F, &c, _1, _2); 

其中delete_class是一些神奇的幫手,它改變輸入int(C::*)(int, char)int(int, char)

我懷疑,我可以在boost::mplboost::function_types的幫助下實現它,但我做不到。

有人,誰有經驗,告訴我該怎麼做?

PS。 VS 2010

+0

你能不能只需使用'auto f = std :: bind(&C :: F,&c,_1,_2);'? – soon 2013-04-25 16:44:34

+0

在真正的應用f是一個結構的成員,所以我不能使用「自動」那裏 – Alek86 2013-04-25 16:51:13

回答

4

如果你需要一個類型特徵delete_class你的願望的作品,這其中應該做的工作:

template<typename S> 
struct delete_class; 

template<typename R, typename C, typename... Ts> 
struct delete_class<R (C::*)(Ts...)> 
{ 
    using type = R(Ts...); 
}; 

下斷言將被滿足:

static_assert(
    std::is_same<delete_class<decltype(&C::F)>::type, 
    int(int, char) 
    >::value, "!"); 

你然後可以使用delete_class<>您建議的方式:

std::function<delete_class<decltype(&C::F)>::type> f; 
C c; 
f = std::bind(&C::F, &c, _1, _2); 

這是一個live example

編輯:

如果僅限於VC10支持(即無可變參數模板),你必須定義delete_class主模板的幾個部分特例:

template<typename S> 
struct delete_class; 

template<typename R, typename C> 
struct delete_class<R (C::*)()> 
{ 
    typedef R(type)(); 
}; 

template<typename R, typename T> 
struct delete_class<R (C::*)(T)> 
{ 
    typedef R(type)(T); 
}; 

template<typename R, typename T, typename U> 
struct delete_class<R (C::*)(T, U)> 
{ 
    typedef R(type)(T, U); 
}; 

template<typename R, typename T, typename U, typename V> 
struct delete_class<R (C::*)(T, U, V)> 
{ 
    typedef R(type)(T, U, V); 
}; 

// And so on... 
+0

哦,對不起,忘了提及:VS2010 ... – Alek86 2013-04-25 16:46:28

+0

@ Alek86:上面應該與VC10 – 2013-04-25 16:47:41

+0

VS 2010不支持variadic模板:( – Alek86 2013-04-25 16:50:09