这个模板语法是否可以改进?
我有这个模板方法:
template <class SomeLhs, class SomeRhs,
ResultType (SomeLhs::*callback)(SomeRhs&)>
void Add() {
struct Local {
static ResultType Trampoline(BaseLhs& lhs, BaseRhs& rhs) {
return (static_cast<SomeLhs&>(lhs).*callback)(static_cast<SomeRhs&>(rhs));
}
};
_back_end.template Add<SomeLhs,SomeRhs>(&Local::Trampoline);
}
目前我称之为:
tracker.Add<Quad, Multi, &Quad::track>();
tracker.Add<Quad, Singl, &Quad::track>();
tracker.Add<Sext, Multi, &Sext::track>();
...
它工作正常,但我不喜欢重复两次SomeLhs
类的SomeLhs
。 有没有办法避免这种情况?
对于那些可能已经认识到的人来说:是的,这与Alexandrescu的BasicFastDispatcher有关,特别是我正在写一个前端来处理成员函数。
我不认为它不能得到特别的改善,这是不幸的,因为我很想找到办法做到这一点。
模板类型推理只能用于函数模板参数,并且您需要在编译时传入非类型成员函数指针,以便将其视为名称而不是变量。 这意味着必须指定所有的参数。
即你可以这样做:
template <class SomeLhs, class SomeRhs>
void Add(ResultType (SomeLhs::*callback)(SomeRhs&)) {
...
}
// nice syntax:
tracker.Add(&Sext::track);
// But ugly for overloaded functions, a cast is needed.
// p.s. not sure this is exactly the right syntax without compiling it.
tracker.Add((ResultType (Quad::*)(Multi&) &Quad::track);
但是,你有一个实际的指针,以后不能用作模板参数。
我认为你可以做的唯一事情就是使用宏,尽管如果它真的在这里改进语法是有争议的。 我会说这可能会增加不必要的混淆程度。
例如
#define TMFN_ARGS(C, M, P1) C, P1, &C::M
tracker.Add<TMFN_ARGS(Quad, track, Multi)>();
编辑:
但是,如果函数的名称始终为'track',则可以按照以下几行进行操作:
template <typename C, typename P1>
void AddTrack() {
Add<C, P1, &C::track>();
}
tracker.AddTrack<Quad, Multi>();
链接地址: http://www.djcxy.com/p/21273.html
上一篇: Could this templated syntax be improved?
下一篇: How to make a realistic roulette ball spinning animation