【发布时间】:2012-01-30 18:14:46
【问题描述】:
我正在尝试构建一个静态绑定的委托类,其中成员函数在编译时绑定,从而有助于优化。
我有以下代码,它完全按照我想要的方式工作:
#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 N> size_t int_array_length(int (&array_ref)[N]) {return N;}。但是当然N函数签名中存在类型的一部分,尽管它本身不是类型。 -
添加一个宏:
#define MAKE_DELEGATE(x, y) thr::delegate<decltype(&x), &x>(y)我看不到任何其他方法可以避免将函数命名两次。 -
@Iori:您确实意识到在您的示例中,
T将是func的类型,因此不需要decltype:) ?
标签: c++ templates delegates c++11