我想構建一個靜態綁定的委託類,其中成員函數在編譯時綁定,從而幫助優化。指向成員函數的模板參數推導?
我有下面的代碼的工作正是我希望它:
#include <iostream>
namespace thr {
template<typename T, T func>
struct delegate;
template<typename R,
typename C,
typename... A,
R (C::* mem_fun)(A...)>
struct delegate<R(C::*)(A...), mem_fun>
{
delegate(C* obj_)
: _obj(obj_)
{}
R operator()(A... a)
{
return (_obj->*mem_fun)(a...);
}
private:
C* _obj;
};
} // namespace thr
struct foo
{
double bar(int i, int j)
{
return (double)i/(double)j;
}
};
int main()
{
foo f;
typedef thr::delegate<decltype(&foo::bar), &foo::bar> cb;
cb c(&f);
std::cout << c(4, 3);
return 0;
}
但是,使用不是很優雅:
thr::delegate<decltype(&foo::bar), &foo::bar>
我想用一個函數模板,推導出模板參數並返回委託實例;沿(此代碼不能編譯)線的東西:
template<typename C, typename T, T func>
thr::delegate<T, func> bind(T func, C* obj)
{
return thr::delegate<decltype(func), func>(obj);
}
這將使更優雅的語法:
auto cb = bind(&foo::bar, &f);
是否有可能推導出一個函數模板非類型參數?
我試圖實現甚至可能嗎?
有時可以在函數模板中推導一個非類型參數,例如'N'可以在'template size_t int_array_length(int(&array_ref)[N]){return N;}'中推導出來。但是'N''儘管不是一個類型本身,函數簽名中仍然有一部分類型。 –
2012-01-30 18:31:53
添加一個宏:'#define MAKE_DELEGATE(x,y)thr :: delegate(y)'我看不到任何其他方法來避免命名該函數兩次。 –
2012-01-30 18:49:05
@Iori:你知道在你的例子中,'T'是'func'的類型,所以'decltype'沒有必要:)? – 2012-01-30 19:44:05